TDesign Tree组件节点勾选状态无法与后端数据同步怎么办?
在用TDesign的Tree组件做权限配置时遇到个问题,勾选节点后虽然能触发事件,但重新拉取数据时勾选状态就消失了。我用v-model绑定了selectedNodes,也在选中事件里发了请求,但后端返回的数据好像没被正确更新到组件里。
代码大概是这样写的:
<template>
<t-tree
:data="treeData"
checkable
v-model:checkedKeys="checkedKeys"
@check="handleCheck"
/>
</template>
<script setup>
import { ref } from 'vue';
const checkedKeys = ref([]);
const treeData = ref([]);
const handleCheck = (keys) => {
// 发送勾选状态到后端
updatePermissions(keys);
// 但这里直接赋值没效果
checkedKeys.value = keys;
};
</script>
这样写的话,手动修改checkedKeys后页面没变化,页面勾选状态还是以treeData的halfCheck属性为准,是不是哪里没绑定对?
v-model:checkedKeys是不够的,**必须保证treeData里的每个节点的halfCheck和checked状态也同步更新**,不然组件内部状态和数据源不一致,就会出现你描述的“赋值无效”问题。你现在的逻辑是:
- 用
checkedKeys控制选中 key- 但 treeData 节点上的
checked和halfCheck没有更新所以你看到 UI 不更新。因为 Tree 组件是依据节点的
checked和halfCheck属性来渲染状态的。---
### 正确做法:
1. **在
handleCheck中,除了发请求,还要更新treeData节点状态**2. **保证
treeData是响应式的,比如用ref或reactive包裹**你可以参考下面的代码:
---
### 注意事项:
- 如果你用了
halfCheck,逻辑会更复杂一点,得递归判断父子节点状态- 后端返回新数据时也要走一遍这个流程,**不能只更新
treeData的引用**- 建议封装一个方法专门用来处理树节点状态同步,复用性高
---
### 安全提醒:
- 发请求前,**要做校验**,确保
keys是数组且不为空- 如果权限敏感,**不能只靠前端同步,后端必须验证权限变更来源**
---
这样处理后,Tree 组件就能正确显示和更新勾选状态了。