zoukankan      html  css  js  c++  java
  • React Hook 项目中使用了antd4.0 Tree(树形组件)默认展开指定的节点踩坑记录

    项目中使用antd-Tree组件(树形组件),要求默认展开指定的一个节点,但是展开之后在点击收缩,就无法再收缩了。必须配合onExpand事件和autoExpandParent属性。

    一、项目环境

    react: 16+

    antd :4.x 

    二、需要注意

    1.expandedKeys 的类型也很重要,比如下面key是number类型expandedKeys也必须是数字expandedKeys=[1,2],如果是这样xpandedKeys=["1","2"]也不会生效.

    key是string类型expandedKeys也必须是数字expandedKeys=['1','2']

    2.传入的treeData中的key值要唯一,一般实际开发中后端从数据库拿的都是id,因此存在从多个库拿数据id相同的问题,此时需要加上—_或则- 拼接id 是比较好的方法

    三、代码展示

    数据:

    const treeData = [
      {
        title: '0-0',
        key: 1,
        children: [
          {
            title: '0-0-0',
            key: 4,
            children: [
              {
                title: '0-0-0-0',
                key: 12,
              },
              {
                title: '0-0-0-1',
                key: 13,
              },
              {
                title: '0-0-0-2',
                key: 14,
              },
            ],
          },
          {
            title: '0-0-1',
            key: 15,
            children: [
              {
                title: '0-0-1-0',
                key: 5,
              },
              {
                title: '0-0-1-1',
                key: 6,
              },
              {
                title: '0-0-1-2',
                key: 7,
              },
            ],
          },
          {
            title: '0-0-2',
            key: 8,
          },
        ],
      },
      {
        title: '0-1',
        key: 2,
        children: [
          {
            title: '0-1-0-0',
            key: 9,
          },
          {
            title: '0-1-0-1',
            key: 10,
          },
          {
            title: '0-1-0-2',
            key: 11,
          },
        ],
      },
      {
        title: '0-2',
        key: 3,
      },
    ];

    组件:

    const Demo = () => {
      const [expandedKeys, setExpandedKeys] = useState([2]);
      const [autoExpandParent, setAutoExpandParent] = useState(true);
        useEffect(()=>{
            setExpandedKeys([`${parentRegionIds}`])
        },[parentRegionIds])
           console.log('expandedKeys',expandedKeys) 
    //展开的回调
    const onExpand = (expandedKeysValue) => {
    console.log(
    'onExpand', expandedKeysValue); // if not set autoExpandParent to false, if children expanded, parent can not collapse.
    // or, you can remove all expanded children keys.
    setExpandedKeys(expandedKeysValue);
    setAutoExpandParent(
    false);
    };
    return (
    <Tree
    onExpand
    ={onExpand} //展开事件
    expandedKeys={expandedKeys}//默认展开的key
    autoExpandParent={autoExpandParent}//是否自动展开父节点
    //showLine={true} //是否开启节点之间带连接线的树 开启之后可以用 switcherIcon 修改默认图标
    //switcherIcon={<DownOutlined />} //默认图标

    treeData={treeData}//树节点数据 /> ); };

    四、总结

    antd跟默认相关的前缀有default的都只是第一次有用,第二次就没用了。

    五、重点

    在实现这个功能需求的时候,我的默认第一个需要展开的节点是从别的组件传递过来的,所以就会存在第一次值有可能是空的或者undefined,然后我使用的是hook,useState第一次赋值就会有这样一个问题,我的值第一次试空或者undefined,useState不会再更新了,所以我的默认值为空,默认节点也不会展开。一直没想明白这个问题。后来想到了使用useEffect,解决了这个问题。

     useEffect(()=>{
            setExpandedKeys([`${parentRegionIds}`])
        },[parentRegionIds])

    还有一种方式就是使用if判断,如果parentRegionIds有值再setExpandedKeys更新一下

    const [expandedKeys, setExpandedKeys] = useState([]);
    if(props.parentRegionIds{ setExpandedKeys(props.parentRegionIds) }
  • 相关阅读:
    hadoop与spark的处理技巧(六)聚类算法(3)LDA
    hadoop与spark的处理技巧(一)Top N处理技巧
    从零开始学Python 三(网络爬虫)
    Could not get JDBC Connection--java
    idea函数被调用
    人工智能-我们应该了解什么(一)
    从零开始学Python 二
    从零开始学Python 一
    java8 简便的map和list操作
    Could not autowire. No beans of 'xxxx' type found的错误
  • 原文地址:https://www.cnblogs.com/shine1234/p/14781411.html
Copyright © 2011-2022 走看看