Vue3+elementPlus中 树形控件封装的实现
1.组件
<template>
<div class="selection">
<el-select placeholder="请选择" v-model="nameList" clearable @clear="handleClear" ref="selectUpResId" style="width: 100%">
<el-option hidden :key="1" :value="1"></el-option
><!--这个必不可少否则显示不出来下拉数据-->
<!-- check-strictly :父子是否联动,根据业务修改 -->
<el-tree
:data="options"
node-key="id"
:props="defaultProps"
:default-checked-keys="huixianarr"
@check="handleNodeClick"
show-checkbox
ref="treeRef"
:check-strictly="true"
>
</el-tree>
</el-select>
</div>
</template>
<script setup name="selects">
import { ref, reactive } from "vue";
//接受父组件传来的数据
const props = defineProps({
treeFilterData: {
type: Array,
default: () => [] //树形控件数据源
},
treeHxlist: {
type: Array,
default: () => [] //回显ID集合,根据业务修改
},
dfProps: {
type: Object,
default: () => {} //树形控件配置项,根据业务修改
}
});
const treeRef = ref();
let nameList = ref("");
let huixianarr = ref([]);
let idList = ref();
let options = ref([]);
let defaultProps = ref({});
defaultProps.value = props.dfProps;
let hxlist = ref([]);
let treeForm = ref();
let list = ref();
var propertyName = props.dfProps.label;
init();
function init() {
options.value = props.treeFilterData;
huixianarr.value = props.treeHxlist;
let hxlist = findPathsByIds(options.value, huixianarr.value);
nameList.value = hxlist.join(","); //显示内容
}
const emit = defineEmits(["checKedId"]);
function handleNodeClick(data, lst) {
let arr = [],
name = [];
lst.checkedNodes.forEach(item => {
//过滤拿到选中的id
arr.push(item.id);
});
lst.checkedNodes.forEach(item => {
//过滤拿到选中的name
name.push(item[propertyName]);
});
nameList.value = name.join(","); //显示内容
idList.value = arr; //后台传参需要的id
//传给父组件
emit("checKedId", idList.value);
}
function handleClear() {
hxlist.value = [];
idList.value = []; //id集合
nameList.value = ""; //input显示内容
huixianarr.value = []; //回显ID集合
treeRef.value.setCheckedKeys([]); //清空
}
function findPathsByIds(data, targetIds) {
const resultPaths = []; // 存储匹配的 title
// 辅助函数:递归查找单个 id 的 title
function findPathRecursive(items, targetId) {
for (const item of items) {
// 如果当前项的 id 匹配,添加其 title 到结果数组
if (item.id === targetId) {
resultPaths.push(item[propertyName]);
return; // 找到后直接返回
}
// 如果有 children,递归查找
if (item.children && item.children.length > 0) {
findPathRecursive(item.children, targetId);
}
}
}
// 遍历目标 id 数组,逐一查找
for (const id of targetIds) {
findPathRecursive(data, id);
}
return resultPaths;
}
</script>
<style scoped>
.selection {
width: 300px;
}
</style>2.使用
<Selectoption :treeFilterData="treeFilterData" :treeHxlist="treeHxlist" :dfProps="dfProps" @checKedId="gettreelist" />
//回显
const treeFilterData = ref([1]);
//格式
let dfProps = ref({
children: "children",
label: "title"
});
//数据
const treeFilterData = ref([
{
"id": 1,
"path": "/home/index",
"name": "home",
"component": "/home/index",
"title": "首页",
"meta": {
"icon": "HomeFilled",
"title": "首页",
"isLink": "",
"isHide": false,
"isFull": false,
"isAffix": true,
"isKeepAlive": true
}
},
{
"id": 6,
"path": "/system",
"name": "system",
"redirect": "/system/accountManage",
"title": "系统管理",
"meta": {
"icon": "Tools",
"title": "系统管理",
"isLink": "",
"isHide": false,
"isFull": false,
"isAffix": false,
"isKeepAlive": true
},
"children": [
{
"id": 61,
"father": 6,
"path": "/system/accountManage",
"name": "accountManage",
"component": "/system/accountManage/index",
"title": "账号管理",
"meta": {
"icon": "Menu",
"title": "账号管理",
"isLink": "",
"isHide": false,
"isFull": false,
"isAffix": false,
"isKeepAlive": true
}
},
]
}
]);上一篇:使用Node.js获取电脑配置信息的实现方法(CPU型号、内存大小、磁盘类型等)
栏 目:JavaScript
本文标题:Vue3+elementPlus中 树形控件封装的实现
本文地址:https://zz.feitang.co/wangluobiancheng/23735.html
您可能感兴趣的文章
- 07-25如何使用 Deepseek 写的uniapp油耗计算器
- 07-25JavaScript其他类型的值转换为布尔值的规则详解
- 07-25JavaScript实现给浮点数添加千分位逗号的多种方法
- 07-25ReactNative环境搭建的教程
- 07-25JavaScript获取和操作时间戳的用法详解
- 07-25通过Vue实现Excel文件的上传和预览功能
- 07-25Node使用Puppeteer监听并打印网页的接口请求
- 07-25在Node.js中设置响应的MIME类型的代码详解
- 07-25Vue3解决Mockjs引入后并访问404(Not Found) 的页面报错问题
- 07-25如何利用SpringBoot与Vue3构建前后端分离项目


阅读排行
推荐教程
- 04-23JavaScript Array实例方法flat的实现
- 04-23Vue3使用v-if指令进行条件渲染的实例代码
- 04-23THREE.JS使用TransformControls对模型拖拽的代码实例
- 07-21JavaScript判断数据类型的四种方式总结
- 07-22JavaScript随机数生成各种技巧及实例代码
- 07-21JavaScript检查变量类型的常用方法
- 07-21基于vue3与supabase系统认证机制详解
- 04-23vue3+ts项目搭建的实现示例
- 07-21JavaScript双问号操作符(??)的惊人用法总结大全
- 07-22使用Node.js实现GitHub登录功能





