elementPlus 中的 el-tree-select 在懒加载的同时,实现远程搜索。并且防止在多个 el-tree-select 组件之间切换时,出现上一个组件的显示值变成一个 id 的问题
...大约 3 分钟
elementPlus 中的 el-tree-select 在懒加载的同时,实现远程搜索。并且防止在多个 el-tree-select 组件之间切换时,出现上一个组件的显示值变成一个 id 的问题
背景
项目中,对于结构复杂的树形数据选择,一般会使用懒加载的方式。但是懒加载的同时,又需要实现远程搜索,这时候就需要对 el-tree-select 进行一些处理了。
注意,当页面上有多个 el-tree-select 组件时,如果没有配置 value-key,对一个组件进行搜索选中操作,然后点击第二个组件时,可能会导致上一个组件的显示值变成一个 id 值。
1、在之前懒加载的配置之上,增加一些关于搜索的配置
<template>
<div>
<el-tree-select
v-model="formDataModel.deptId"
v-show="formHidden.deptId"
:disabled="formDisabled.deptId || disabledBig"
check-strictly
lazy
:load="loadNode"
value-key="deptId"
@node-click="selectNode"
:cache-data="cacheData"
:props="{
value: 'deptId',
label: 'deptName',
children: 'children'
}"
filterable
:filter-method="remoteMethod"
:data="deptOptions"
remote
:loading="treeloading" />
</div>
</template>
<script setup>
// 实现懒加载的方法
const loadNode = (node, resolve) => {
findRootListByDeptIdList({
parentId: node.data.deptId
}).then((res) => {
console.log(266, res)
return resolve(res.data)
})
}
// 实现搜索的方法
const treeLoading = ref(false)
const deptOptions = ref([])
const remoteMethod = (query) => {
if (query) {
treeloading.value = true
findRootListByDeptIdList({
deptName: query
}).then((res) => {
deptOptions.value = res.data
treeLoading.value = false
})
}
}
// v-model id值。只要这个id值在树里能匹配上,就能够顺利回显出其label值。
// lazy 是否懒加载子节点,需与 load 方法结合使用
// load 加载子树数据的方法,仅当 lazy 属性为true 时生效
// value-key 它的作用是 指定选中项(v-model 绑定值)的唯一标识字段
// node-key 每个树节点用来作为唯一标识的属性。简单理解为树节点的主键
// cache-data 用作数据回显
// props 配置选项。一般配置value和label的属性值
// data 树的数据
// filterable 组件是否可筛选
// remote 其中的选项是否从服务器远程加载
// filter-method 自定义筛选方法
</script>
2、在 el-tree-select 组件上增加 value-key 属性,防止在多个 el-tree-select 组件之间切换时,出现上一个组件的显示值变成一个 id 的问题
提示
在 Element Plus 的 el-tree-select 组件中,value-key 是一个非常关键的属性,它的作用是 指定选中项(v-model 绑定值)的唯一标识字段。
在使用 el-tree-select 的时候,我们点击搜索结果,虽然 v-model 绑定的值会变成点击节点的 id,但是显示的值还是点击节点的 label。这是因为 el-tree-select 组件内部已经做了处理。也就是说,其实 el-tree-select 组件会缓存这个节点对象,用以显示。咱们使用 cache-data 属性,把缓存的数据传递给 el-tree-select 组件,也是这个原理。
当第一个组件选中一个对象(如 { id: 1, label: '选项 A' })时,组件内部通过 value-key 判断该对象的唯一性。如果未设置 value-key,组件可能将该对象视为临时值,导致后续操作(如第二个组件的交互)触发 Vue 的响应式更新机制时,第一个组件的绑定值被重置为 id。
而且懒加载的数据是动态加载的,每次加载的节点对象可能是新的实例(引用地址不同)。如果没有 value-key,组件无法正确识别这些对象是否与已选中的对象一致,导致绑定值异常。