组件树更新后选中状态为啥不刷新?
我在做可视化编辑器的组件树,每次拖拽新组件进来,树结构能正常更新,但之前选中的节点状态没清掉,导致新节点无法被正确选中。我明明已经用 v-model 绑定了当前选中项啊。
试过在数据变更后手动重置 selectedComponentId,也试过 nextTick 里强制更新,都不行。是不是哪里响应式没触发?
<template>
<div v-for="node in componentTree" :key="node.id"
:class="{ selected: node.id === selectedComponentId }"
@click="selectNode(node.id)">
{{ node.name }}
</div>
</template>
<script>
export default {
data() {
return {
selectedComponentId: null,
componentTree: []
}
},
methods: {
selectNode(id) {
this.selectedComponentId = id;
}
}
}
</script>
selectedComponentId还指着那个已经不存在的 ID,Vue 的响应式可不会自动帮你清掉这个状态。你的代码本身没问题,问题在于缺少一个检测逻辑。我之前也碰到过类似的情况,后来是这么解决的:
在 componentTree 变化时检测选中项是否还有效,如果指向的节点已经不在树里了,就重置选中状态。
加了 deep: true 是为了监听数组内部对象的变化。如果你确认只是整个数组替换,不涉及深层改动,去掉 deep 也能跑。
另外提醒一下,如果你的 componentTree 结构有子节点嵌套,上面这个 some 只能检查顶层节点。你可能需要递归检查一下:
试试看能不能解决你的问题。