最近在应用a-tree增加搜寻的时候发现了一个问题;只有树节点超过2级,对第三级及以下级数进行搜寻的时候毫无反馈

a-tree

a-tree 实现了通过expandeKeys来设定须要开展的树节点Key,再设置autoExpandParent来开展举个例子:

组件 :

<a-tree  :tree-data="treeData"  :expandedKeys="expandedKeys"  @select="clickTree"  @expand="onExpand"  :auto-expand-parent="autoExpandParent">

咱们晓得,想要开展只有设置autoExpandParent为true,再把须要开展的节点设置到expandeKeys外面即可

官网的办法:

onChange(e) {  const value = e.target.value;  const expandedKeys = dataList    .map(item => {      if (item.title.indexOf(value) > -1) {        return getParentKey(item.key, gData);      }      return null;    })    .filter((item, i, self) => item && self.indexOf(item) === i);  Object.assign(this, {    expandedKeys,    searchValue: value,    autoExpandParent: true,  });},

这个办法理论能够失去对应的搜寻到的节点父节点,然而在超过2级的树节点就呈现了问题,不能开展

而后我对其办法进行了革新,想着是不是把以后的父节点拿到进行开展并不够,要把父节点的父节点的父节点都拿到呢~(就是始终拿到根节点啦)

搜寻办法

treeSearch(e) {  const value = e.target.value;  if (!value) return;  this.searchValue = value  if (this.searchValue === '') {    this.expandedKeys = []  } else {    this.expandedKeys = []    this.backupsExpandedKeys = []    const candidateKeysList = this.getkeyList(      this.searchValue,      this.treeData,      []    )    candidateKeysList.forEach((item) => {      const key = this.getParentKey(item, this.treeData)      // eslint-disable-next-line no-shadow      if (        key &&        !this.backupsExpandedKeys.some((item) => item === key)      )        this.backupsExpandedKeys.push(key)    })    const { length } = this.backupsExpandedKeys    // eslint-disable-next-line no-plusplus    for (let i = 0; i < length; i++) {      this.getAllParentKey(        this.backupsExpandedKeys[i],        this.treeData      )    }    this.expandedKeys = this.backupsExpandedKeys.slice()  }},getkeyList(value, tree, keyList) {  // eslint-disable-next-line no-plusplus  for (let i = 0; i < tree.length; i++) {    const node = tree[i]    if (node.title.indexOf(value) > -1) {      keyList.push(node.key)    }    if (node.children) {      this.getkeyList(value, node.children, keyList)    }  }  return keyList},
先革新搜寻办法

再写一个获取所有父节点的办法

getAllParentKey(key, tree) {  let parentKey  if (key) {    parentKey = this.getParentKey(key, tree)    if (parentKey) {      if (        !this.backupsExpandedKeys.some(          (item) => item === parentKey        )      ) {        this.backupsExpandedKeys.push(parentKey)      }      this.getAllParentKey(parentKey, tree)    }  }},

还有个根本的获取以后父节点的办法也写上来

getParentKey(key, tree) {  let parentKey  let temp  // eslint-disable-next-line no-plusplus  for (let i = 0; i < tree.length; i++) {    const node = tree[i]    if (node.children) {      if (node.children.some((item) => item.key === key)) {        parentKey = node.key        // eslint-disable-next-line no-cond-assign      } else if ((temp = this.getParentKey(key, node.children))) {        parentKey = temp      }    }  }  return parentKey},

这样就解决了a-tree的搜寻问题啦

总结来说就是:

官网只获取了以后父节点进行开展,然而当树节点超过2级的时候,对第三级数据进行搜寻就有效了

tips: 官网的这个树组件再查找匹配搜寻内容的时候,把树的所有数据做了扁平化解决再进行循环匹配,如果数据量大的时候不倡议应用,会卡