Ant-tree添加搜索框功能
<template>
<a-col>
<a-input-search
v-model="searchTree"
placeholder="请搜索"
@search="searchClick"
@change="searchClick"
/>
<a-tree :treeData="scheduleTreeList" />
</a-col>
</template>
<script>
// 深拷贝(不懂得话百度一下) 或者我博客也有自己封装的深拷贝的方法(拷贝对象和数组可以参考一下)
import cloneDeep from "lodash.clonedeep";
export default {
data() {
return {
// 树数据
scheduleTreeList: [],
// 搜索时需要一个数组接收后台传过来的data数据
searchScheduleTreeList: [],
// 搜索框的v-model值
searchTree: "",
};
},
methods: {
// 模拟后台发请求拿数据加载
loadTree() {
// loadDataTree模拟向后台发送请求的API
loadDataTree().then((res) => {
// scheduleTreeList存放treeData
this.scheduleTreeList = res.list;
// searchScheduleTreeList 用于搜索时不发请求拿数据
this.searchScheduleTreeList = res.list;
});
},
// 树搜索方法
searchClick() {
// searchTree 搜索框的V-model
if (this.searchTree.length > 0) {
// 如果搜索框的输入值大于0那么当前树的数据清空并重新赋值
this.scheduleTreeList = [];
// this.fetch() 检索所有的数据并且给tree重新赋值
this.fetch(
this.searchTree, // 参数一 当前搜索框的值
this.searchScheduleTreeList, // 参数二 拿取之前存放treeData的数据(treeData的备用数据)
(data) => (this.scheduleTreeList = data) // 参数三 callback返回值
);
} else {
// 如果用户清空搜索框 那么重新赋值显示所有数据
this.scheduleTreeList = this.searchScheduleTreeList;
}
},
// tree搜索时检索关键字段的方法
fetch(value, data, callback) {
let that = this;
// 定义新数组便于重新赋值
let arr = [];
function changeFieldCode(data, arr) {
data.filter((item) => {
// 先判断有无子节点(这里加避免查出来的数据重复<父节点包含检索词并还且带有子节点>)
if (item.children.length !== 0) {
// 页面显示的字段是item.title(根据项目需求进行修改)
if (item.title.toLowerCase().indexOf(value.toLowerCase()) >= 0) {
// 如果父节点包含检索值直接深拷贝(不改变原来的data值)
let val = cloneDeep(item);
// 并且清空父节点包含的所有子节点
val.children.length = 0;
// 存放到一个新的数组
arr.push(val);
}
// 继续递归遍历它的所有节点
changeFieldCode(item.children, arr);
} else {
// 如果没有子节点且包含检索值直接把当前Item存放进数组
if (item.title.toLowerCase().indexOf(value.toLowerCase()) >= 0) {
arr.push(item);
}
}
});
// 最后把所有检索到的值返回callback
callback(arr);
}
// 最后别忘记调用函数changeFieldCode
changeFieldCode(data, arr);
},
},
};
</script>
如果差一点,那就再努力一点
浙公网安备 33010602011771号