99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Element-React Tree 樹形控件

2020-10-16 11:32 更新

用清晰的層級(jí)結(jié)構(gòu)展示信息,可展開或折疊。

基礎(chǔ)用法

基礎(chǔ)的樹形結(jié)構(gòu)展示。

constructor(props) {
  super(props);


  this.state = {
    data: [{
      label: '一級(jí) 1',
      children: [{
        label: '二級(jí) 1-1',
        children: [{
          label: '三級(jí) 1-1-1'
        }]
      }]
    }, {
      label: '一級(jí) 2',
      children: [{
        label: '二級(jí) 2-1',
        children: [{
          label: '三級(jí) 2-1-1'
        }]
      }, {
        label: '二級(jí) 2-2',
        children: [{
          label: '三級(jí) 2-2-1'
        }]
      }]
    }, {
      label: '一級(jí) 3',
      children: [{
        label: '二級(jí) 3-1',
        children: [{
          label: '三級(jí) 3-1-1'
        }]
      }, {
        label: '二級(jí) 3-2',
        children: [{
          label: '三級(jí) 3-2-1'
        }]
      }]
    }],
    options: {
      children: 'children',
      label: 'label'
    }
  }
}


render() {
  return (
    <Tree
      data={this.state.data}
      options={this.state.options}
      highlightCurrent={true}
      onCheckChange={(data, checked, indeterminate)=>{
        console.debug('onCheckChange: ', data, checked, indeterminate)}
      }
      onNodeClicked={(data, reactElement,)=>{
        console.debug('onNodeClicked: ', data, reactElement)
      }}
    />
  )
}

可選擇

適用于需要選擇層級(jí)時(shí)使用。在下例中,由于在點(diǎn)擊時(shí)才進(jìn)行該層數(shù)據(jù)的獲取,導(dǎo)致層級(jí)不可預(yù)知,如果沒有下層數(shù)據(jù),則點(diǎn)擊后下拉按鈕會(huì)消失。

constructor(props) {
  super(props)
  this.state = {
    regions: [{
      'name': 'region1'
    }, {
      'name': 'region2'
    }]
  }


  this.options = {
    label: 'name',
    children: 'zones'
  }
  this.count = 1


}


handleCheckChange(data, checked, indeterminate) {
  console.log(data, checked, indeterminate);
}


loadNode(node, resolve) {


  if (node.level === 0) {
    return resolve([{ name: 'region1' }, { name: 'region2' }]);
  }
  if (node.level > 3) return resolve([]);


  var hasChild;
  if (node.data.name === 'region1') {
    hasChild = true;
  } else if (node.data.name === 'region2') {
    hasChild = false;
  } else {
    hasChild = Math.random() > 0.5;
  }


  setTimeout(() => {
    var data;
    if (hasChild) {
      data = [{
        name: 'zone' + this.count++
      }, {
        name: 'zone' + this.count++
      }];
    } else {
      data = [];
    }


    resolve(data);
  }, 500);
}


render() {
  const { regions } = this.state


  return (
    <Tree
      data={regions}
      options={this.options}
      isShowCheckbox={true}
      lazy={true}
      load={this.loadNode.bind(this)}
      onCheckChange={this.handleCheckChange.bind(this)}
      onNodeClicked={(data, nodeModel, reactElement, treeNode)=>{
        console.debug('onNodeClicked: ', data, nodeModel, reactElement)
      }}
    />
  )
}

默認(rèn)展開和默認(rèn)選中

可將 Tree 的某些節(jié)點(diǎn)設(shè)置為默認(rèn)展開或默認(rèn)選中

分別通過defaultExpandedKeysdefaultCheckedKeys設(shè)置默認(rèn)展開和默認(rèn)選中的節(jié)點(diǎn)。需要注意的是,此時(shí)必須設(shè)置nodeKey,其值為節(jié)點(diǎn)數(shù)據(jù)中的一個(gè)字段名,該字段在整棵樹中是唯一的。

constructor(props) {
  super(props);


  this.state = {
    data: [{
      id: 1,
      label: '一級(jí) 1',
      children: [{
        id: 4,
        label: '二級(jí) 1-1',
        children: [{
          id: 9,
          label: '三級(jí) 1-1-1'
        }, {
          id: 10,
          label: '三級(jí) 1-1-2'
        }]
      }]
    }, {
      id: 2,
      label: '一級(jí) 2',
      children: [{
        id: 5,
        label: '二級(jí) 2-1'
      }, {
        id: 6,
        label: '二級(jí) 2-2'
      }]
    }, {
      id: 3,
      label: '一級(jí) 3',
      children: [{
        id: 7,
        label: '二級(jí) 3-1'
      }, {
        id: 8,
        label: '二級(jí) 3-2'
      }]
    }],
    options: {
      children: 'children',
      label: 'label'
    }
  }
}


render() {
  const { data, options } = this.state


  return (
    <Tree
      data={data}
      options={options}
      isShowCheckbox={true}
      nodeKey="id"
      defaultExpandedKeys={[2, 3]}
      defaultCheckedKeys={[5]}
    />
  )
}

樹節(jié)點(diǎn)的選擇

通過 node 獲取通過 key 獲取通過 node 設(shè)置通過 key 設(shè)置清空

本例展示如何獲取和設(shè)置選中節(jié)點(diǎn)。獲取和設(shè)置各有兩種方式:通過 node 或通過 key。如果需要通過 key 來獲取或設(shè)置,則必須設(shè)置nodeKey。

constructor(props) {
  super(props);


  this.state = {
    data: [{
      id: 1,
      label: '一級(jí) 1',
      children: [{
        id: 4,
        label: '二級(jí) 1-1',
        children: [{
          id: 9,
          label: '三級(jí) 1-1-1'
        }, {
          id: 10,
          label: '三級(jí) 1-1-2'
        }]
      }]
    }, {
      id: 2,
      label: '一級(jí) 2',
      children: [{
        id: 5,
        label: '二級(jí) 2-1'
      }, {
        id: 6,
        label: '二級(jí) 2-2'
      }]
    }, {
      id: 3,
      label: '一級(jí) 3',
      children: [{
        id: 7,
        label: '二級(jí) 3-1'
      }, {
        id: 8,
        label: '二級(jí) 3-2'
      }]
    }],
    options: {
      children: 'children',
      label: 'label'
    }
  }
}


getCheckedNodes() {
  console.log(this.tree.getCheckedNodes());
}
getCheckedKeys() {
  console.log(this.tree.getCheckedKeys());
}
setCheckedNodes() {
  this.tree.setCheckedNodes([{
    id: 5,
    label: '二級(jí) 2-1'
  }, {
    id: 9,
    label: '三級(jí) 1-1-1'
  }]);
}
setCheckedKeys() {
  this.tree.setCheckedKeys([3]);
}
resetChecked() {
  this.tree.setCheckedKeys([]);
}


render() {
  const { data, options } = this.state


  return (
    <div>
      <Tree
        ref={e=>this.tree = e}
        data={data}
        options={options}
        isShowCheckbox={true}
        highlightCurrent={true}
        nodeKey="id"
        defaultExpandedKeys={[2, 3]}
        defaultCheckedKeys={[5]}
      />
      <div className="buttons">
        <Button onClick={()=>this.getCheckedNodes()}>通過 node 獲取</Button>
        <Button onClick={()=>this.getCheckedKeys()}>通過 key 獲取</Button>
        <Button onClick={()=>this.setCheckedNodes()}>通過 node 設(shè)置</Button>
        <Button onClick={()=>this.setCheckedKeys()}>通過 key 設(shè)置</Button>
        <Button onClick={()=>this.resetChecked()}>清空</Button>
      </div>
    </div>
  )
}

自定義節(jié)點(diǎn)內(nèi)容

節(jié)點(diǎn)的內(nèi)容支持自定義,可以在節(jié)點(diǎn)區(qū)添加按鈕或圖標(biāo)等內(nèi)容

使用renderContent指定渲染函數(shù),該函數(shù)返回需要的節(jié)點(diǎn)區(qū)內(nèi)容即可。渲染函數(shù)的用法請(qǐng)參考 Vue 文檔。注意:由于 jsfiddle 不支持 JSX 語法,所以本例在 jsfiddle 中無法運(yùn)行。但是在實(shí)際的項(xiàng)目中,只要正確地配置了相關(guān)依賴,就可以正常運(yùn)行。

constructor(props) {
  super(props);


  this.state = {
    data: [{
      id: 1,
      label: '一級(jí) 1',
      children: [{
        id: 4,
        label: '二級(jí) 1-1',
        children: [{
          id: 9,
          label: '三級(jí) 1-1-1'
        }, {
          id: 10,
          label: '三級(jí) 1-1-2'
        }]
      }]
    }, {
      id: 2,
      label: '一級(jí) 2',
      children: [{
        id: 5,
        label: '二級(jí) 2-1'
      }, {
        id: 6,
        label: '二級(jí) 2-2'
      }]
    }, {
      id: 3,
      label: '一級(jí) 3',
      children: [{
        id: 7,
        label: '二級(jí) 3-1'
      }, {
        id: 8,
        label: '二級(jí) 3-2'
      }]
    }],
    options: {
      children: 'children',
      label: 'label'
    }
  }
  this.id = 100;
}


append(store, data) {
  store.append({ id: this.id++, label: `testtest_${this.id}`, children: [] }, data);
}


remove(store, data) {
  store.remove(data);
}


renderContent(nodeModel, data, store) {
  return (
    <span>
      <span>
        <span>{data.label}</span>
      </span>
      <span style={{float: 'right', marginRight: '20px'}}>
        <Button size="mini" onClick={ () => this.append(store, data) }>Append</Button>
        <Button size="mini" onClick={ () => this.remove(store, data) }>Delete</Button>
      </span>
    </span>);
}


render() {
  const { data, options } = this.state


  return (
    <Tree
      data={data}
      options={options}
      isShowCheckbox={true}
      nodeKey="id"
      defaultExpandAll={true}
      expandOnClickNode={false}
      renderContent={(...args)=>this.renderContent(...args)}
    />
  )
}

節(jié)點(diǎn)過濾

通過關(guān)鍵字過濾樹節(jié)點(diǎn)

在需要對(duì)節(jié)點(diǎn)進(jìn)行過濾時(shí),調(diào)用 Tree 實(shí)例的filter方法,參數(shù)為關(guān)鍵字。需要注意的是,此時(shí)需要設(shè)置filterNodeMethod,值為過濾函數(shù)。

constructor(props) {
  super(props);


  this.state = {
    data: [{
      id: 1,
      label: '一級(jí) 1',
      children: [{
        id: 4,
        label: '二級(jí) 1-1',
        children: [{
          id: 9,
          label: '三級(jí) 1-1-1'
        }, {
          id: 10,
          label: '三級(jí) 1-1-2'
        }]
      }]
    }, {
      id: 2,
      label: '一級(jí) 2',
      children: [{
        id: 5,
        label: '二級(jí) 2-1'
      }, {
        id: 6,
        label: '二級(jí) 2-2'
      }]
    }, {
      id: 3,
      label: '一級(jí) 3',
      children: [{
        id: 7,
        label: '二級(jí) 3-1'
      }, {
        id: 8,
        label: '二級(jí) 3-2'
      }]
    }],
    options: {
      children: 'children',
      label: 'label'
    }
  }
}


render() {
  const { data, options } = this.state


  return (
    <div>
      <Input placeholder="輸入關(guān)鍵字進(jìn)行過濾" onChange={text=> this.tree.filter(text)} />
      <Tree
        ref={e=> this.tree = e}
        className="filter-tree"
        data={data}
        options={options}
        nodeKey="id"
        defaultExpandAll={true}
        filterNodeMethod={(value, data)=>{
          if (!value) return true;
          return data.label.indexOf(value) !== -1;
        }}
      />
    </div>


  )
}

手風(fēng)琴模式

對(duì)于同一級(jí)的節(jié)點(diǎn),每次只能展開一個(gè)

constructor(props) {
  super(props);


  this.state = {
    data: [{
      label: '一級(jí) 1',
      children: [{
        label: '二級(jí) 1-1',
        children: [{
          label: '三級(jí) 1-1-1'
        }]
      }]
    }, {
      label: '一級(jí) 2',
      children: [{
        label: '二級(jí) 2-1',
        children: [{
          label: '三級(jí) 2-1-1'
        }]
      }, {
        label: '二級(jí) 2-2',
        children: [{
          label: '三級(jí) 2-2-1'
        }]
      }]
    }, {
      label: '一級(jí) 3',
      children: [{
        label: '二級(jí) 3-1',
        children: [{
          label: '三級(jí) 3-1-1'
        }]
      }, {
        label: '二級(jí) 3-2',
        children: [{
          label: '三級(jí) 3-2-1'
        }]
      }]
    }],
    options: {
      children: 'children',
      label: 'label'
    }
  }
}


render() {
  const { data, options } = this.state


  return (
    <Tree
      ref={e=> this.tree = e}
      data={data}
      options={options}
      accordion={true}
      onNodeClicked={node=>console.log(node)}
    />
  )
}

Attributes

參數(shù) 說明 類型 可選值 默認(rèn)值
data 展示數(shù)據(jù) array
emptyText 內(nèi)容為空的時(shí)候展示的文本 String
nodeKey 每個(gè)樹節(jié)點(diǎn)用來作為唯一標(biāo)識(shí)的屬性,整顆樹應(yīng)該是唯一的 String
options 配置選項(xiàng),具體看下表 object
load 加載子樹數(shù)據(jù)的方法 function(node, resolve)
renderContent 樹節(jié)點(diǎn)的內(nèi)容區(qū)的渲染 Function (nodeModel, data, store)=>ReactElement
highlightCurrent 是否高亮當(dāng)前選中節(jié)點(diǎn),默認(rèn)值是 false。 boolean false
currentNodeKey 當(dāng)前選中節(jié)點(diǎn)的 key,只寫屬性 string, number
defaultExpandAll 是否默認(rèn)展開所有節(jié)點(diǎn) boolean false
expandOnClickNode 是否在點(diǎn)擊節(jié)點(diǎn)的時(shí)候展開或者收縮節(jié)點(diǎn), 默認(rèn)值為 true,如果為 false,則只有點(diǎn)箭頭圖標(biāo)的時(shí)候才會(huì)展開或者收縮節(jié)點(diǎn)。 boolean true
autoExpandParent 展開子節(jié)點(diǎn)的時(shí)候是否自動(dòng)展開父節(jié)點(diǎn) boolean true
defaultExpandedKeys 默認(rèn)展開的節(jié)點(diǎn)的 key 的數(shù)組 array
isShowCheckbox 節(jié)點(diǎn)是否可被選擇 boolean false
checkedKeyStrictly 在顯示復(fù)選框的情況下,是否嚴(yán)格的遵循父子不互相關(guān)聯(lián)的做法,默認(rèn)為 false boolean false
defaultCheckedKeys 默認(rèn)勾選的節(jié)點(diǎn)的 key 的數(shù)組 array
filterNodeMethod 對(duì)樹節(jié)點(diǎn)進(jìn)行篩選時(shí)執(zhí)行的方法,返回 true 表示這個(gè)節(jié)點(diǎn)可以顯示,返回 false 則表示這個(gè)節(jié)點(diǎn)會(huì)被隱藏 Function(value, data, node)
accordion 是否每次只打開一個(gè)同級(jí)樹節(jié)點(diǎn)展開 boolean false
indent 相鄰級(jí)節(jié)點(diǎn)間的水平縮進(jìn),單位為像素 number 16

options

參數(shù) 說明 類型 可選值 默認(rèn)值
label 指定節(jié)點(diǎn)標(biāo)簽為節(jié)點(diǎn)對(duì)象的某個(gè)屬性值 string
children 指定子樹為節(jié)點(diǎn)對(duì)象的某個(gè)屬性值 string

方法

Tree 擁有如下方法,返回目前被選中的節(jié)點(diǎn)數(shù)組:

方法名 說明 參數(shù)
filter 對(duì)樹節(jié)點(diǎn)進(jìn)行篩選操作 接收一個(gè)任意類型的參數(shù),該參數(shù)會(huì)在 filterNodeMethod 中作為第一個(gè)參數(shù)
getCheckedNodes 若節(jié)點(diǎn)可被選擇(即 isShowCheckbox 為 true),則返回目前被選中的節(jié)點(diǎn)所組成的數(shù)組 (leafOnly) 接收一個(gè) boolean 類型的參數(shù),若為 true 則僅返回被選中的葉子節(jié)點(diǎn),默認(rèn)值為 false
setCheckedNodes 設(shè)置目前勾選的節(jié)點(diǎn),使用此方法必須設(shè)置 nodeKey 屬性 (nodes) 接收勾選節(jié)點(diǎn)數(shù)據(jù)的數(shù)組
getCheckedKeys 若節(jié)點(diǎn)可被選擇(即 isShowCheckbox 為 true),則返回目前被選中的節(jié)點(diǎn)所組成的數(shù)組 (leafOnly) 接收一個(gè) boolean 類型的參數(shù),若為 true 則僅返回被選中的葉子節(jié)點(diǎn)的 keys,默認(rèn)值為 false
setCheckedKeys 通過 keys 設(shè)置目前勾選的節(jié)點(diǎn),使用此方法必須設(shè)置 nodeKey 屬性 (keys, leafOnly) 接收兩個(gè)參數(shù),1. 勾選節(jié)點(diǎn)的 key 的數(shù)組 2. boolean 類型的參數(shù),若為 true 則僅設(shè)置葉子節(jié)點(diǎn)的選中狀態(tài),默認(rèn)值為 false
setChecked 通過 key / data 設(shè)置某個(gè)節(jié)點(diǎn)的勾選狀態(tài),使用此方法必須設(shè)置 nodeKey 屬性 (key/data, checked, deep) 接收三個(gè)參數(shù),1. 勾選節(jié)點(diǎn)的 key 或者 data 2. boolean 類型,節(jié)點(diǎn)是否選中 3. boolean 類型,是否設(shè)置子節(jié)點(diǎn) ,默認(rèn)為 false

Events

事件名稱 說明 回調(diào)參數(shù)
onNodeClicked 節(jié)點(diǎn)被點(diǎn)擊時(shí)的回調(diào) onNodeClicked(nodeModel.data, node)
onCheckChange 節(jié)點(diǎn)選中狀態(tài)發(fā)生變化時(shí)的回調(diào) onCheckChange(nodeModel.data, checked, indeterminate)
onCurrentChange 當(dāng)前選中節(jié)點(diǎn)變化時(shí)觸發(fā)的事件 onCurrentChange(nodeModel.data, node)
onNodeExpand 節(jié)點(diǎn)被展開時(shí)觸發(fā)的事件 onNodeExpand(nodeModel.data, nodeModel, node)
onNodeCollapse 節(jié)點(diǎn)被關(guān)閉時(shí)觸發(fā)的事件 onNodeCollapse(nodeModel.data, nodeModel, node)

參數(shù)說明

參數(shù) 說明
nodeModel tree node 的 model
nodeModel.data 對(duì)應(yīng)的tree node節(jié)點(diǎn)的傳入的data節(jié)點(diǎn)
node 實(shí)際的view層的react element節(jié)點(diǎn)
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)