Vue3+elementPlus中 树形控件封装的实现

 更新时间:2025年04月15日 08:30:28   作者:知否灬知否  
本文主要介绍了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
          }
        },
        
        
      ]
    }
  ]);

到此这篇关于Vue3+elementPlus中 树形控件封装的实现的文章就介绍到这了,更多相关Vue3 elementPlus树形控件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Vite多环境配置及变量识别规则

    Vite多环境配置及变量识别规则

    这篇文章主要为大家介绍了Vite多环境配置时间及vite识别环境变量的规则,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Vue生命周期与后端交互实现流程详解

    Vue生命周期与后端交互实现流程详解

    Vue的生命周期就是vue实例从创建到销毁的全过程,也就是new Vue()开始就是vue生命周期的开始。Vue实例有⼀个完整的⽣命周期,也就是从开始创建、初始化数据、编译模版、挂载Dom->渲染、更新->渲染、卸载等⼀系列过程,称这是Vue的⽣命周期
    2022-11-11
  • vue3中引入class类的写法代码示例

    vue3中引入class类的写法代码示例

    最近一直在做vue项目,从网上搜索到的资料不太多,这篇文章主要给大家介绍了关于vue3中引入class类的写法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • Vue github用户搜索案例分享

    Vue github用户搜索案例分享

    这篇文章主要介绍了Vue github用户搜索案例分享,文章基于Vue的相关资料展开对主题的详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • Pinia介绍及工作原理解析

    Pinia介绍及工作原理解析

    这篇文章主要为大家介绍了Pinia介绍及工作原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • vue使用路由的query配置项时清除地址栏的参数案例详解

    vue使用路由的query配置项时清除地址栏的参数案例详解

    这篇文章主要介绍了vue使用路由的query配置项时如何清除地址栏的参数,本文通过案例给大家分享完美解决方案,需要的朋友可以参考下
    2023-09-09
  • Vue js如何用split切分并去掉空值和item的空格

    Vue js如何用split切分并去掉空值和item的空格

    这篇文章主要介绍了Vue js如何用split切分并去掉空值和item的空格,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • JavaScript获取echart曲线上任意点位的值详解

    JavaScript获取echart曲线上任意点位的值详解

    这篇文章主要为大家介绍了JavaScript获取echart曲线上任意点位的值详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Vue中的Vux配置指南

    Vue中的Vux配置指南

    Vux是Vue.js的一个ui库,官网在这里,官方文档的配置指南侧重于技术的罗列,我这里简化一下Vux的配置流程。感兴趣的朋友跟随脚本之家小编一起学习吧
    2017-12-12
  • Vue实现数字动画的几种方案

    Vue实现数字动画的几种方案

    本文介绍了三种使用Vue实现动态数字动画的方案:使用Vue的响应式数据与`setInterval`逐步更新数字,通过Vue的动画API和CSS动画效果为数字增加过渡效果,以及使用更高效的`requestAnimationFrame`来提供更加流畅的动画表现,每种方案都详细说明了原理、实现步骤和代码示例
    2025-02-02

最新评论