折叠面板里面查询菜单树时如何做到数据不污染

遇到一个需求就是通过点击每一个折叠面板查询当前panel title的tree数据,问题就是我点击下一个panel的时候查到的数据会覆盖我上一次查询出来的数据,因此数据污染了,那就要处理一下数据。

// 折叠面板

<Collapse onChange={onChange}>
    {newRoleDatas?.map((item)=>( // newRoleDatas是我处理过后的数据,原来的数据是roleData
        <Panel header={item.label} key={item.label}>
            <Tree treeData={treeData} />
        </Panel>
    ))}
</Collapse>

数据处理之前,我先得把我调接口拿到的数据先进行处理一下,给每次查出来的数据一个初始状态(isSelected) false,我展开就为true,关闭就为false。

const [selectedRole, setSelectedRole] = useState([]); // 展开面板的key(包括每一次的key)
const [newRoleDatas, setNewRoleDatas] = useState([]); // 处理之后的roleData
const preRole = useRef(); //上一次存下来的数据

// 折叠面板的变化事件
const onChange=(key)=>{
    setSelectedRole(key)
}

useEffect(()=>{
    // 立即执行函数是因为用到了async函数
    (async ()=>{
        const newData = selectedRole?.filter(item=>{
            return !preRole.current?.includes(item);
        })
        let res = [];
        // 控制只打开panel时调接口
        if(newData?.[0] || selectedRole.length > preRole.current?.length){
            res = await getTreeData(newData[0])
        }
        const newArr = roleData?.map(item=>{
            // 两个数组有相同的值就改变isSelected的状态
            const isSame = selectedRole?.find(it=>it===item.label)
            item.isSelected = !!isSame
            // 给当前展示的那条数据的value存调接口出来的数据,再通过value去渲染每一个panel有哪些值
            if(item.isSelected && item.label === _.last(selectedRole) && res?.length){
                item.value = res;
            }
            return item;
        })
        // 存上一次选中的key
        preRole.current = selectedRole;
        setNewRoleDatas(newArr);
    })()
},[getTreeData, roleData, selectedRole])

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值