Vue-easy-tree封装及使用

1.使用及安装

下载依赖
npm install @wchbrad/vue-easy-tree

引入俩种方案
1.在main.js中引入
import VueEasyTree from "@wchbrad/vue-easy-tree";
import "@wchbrad/vue-easy-tree/src/assets/index.scss"
Vue.use(VueEasyTree)

2.当前页面引入
import VueEasyTree from "@wchbrad/vue-easy-tree";
import "@wchbrad/vue-easy-tree/src/assets/index.scss"

2.封装vue-easy-tree

<template>
    <div class='select-tree-container' ref="selectMutiple">
         <el-input
            autocomplete="off"
            :placeholder="loading?'正在加载数据···':placeholder"
            :readonly="true"
            :disabled="loading"
            :value="checkedTreeData"
            >
            <i v-show="loading" slot="suffix" class="el-input__icon el-icon-loading"></i>
          </el-input>
            <transition name="sub-comments">
              <div

                class="scroll-container"
                v-show="selectTreeFlag">
                <el-input
                  placeholder="输入关键字进行过滤"
                  v-model="filterText"
                 >
                </el-input>
                <VueEasyTree
                    :data="treeData"
                    show-checkbox
                    height="500px"
                    :node-key="treeProps.value"
                    :props="treeProps"
                    :default-checked-keys="newArr"
                    ref="selectMutipleTree"
                    @check="handleCheck"
                    :filter-node-method="filterNode"
                    :check-strictly="checkStrictly">
                </VueEasyTree>
                </div>
            </transition>
    </div>
</template>

<script>
import VueEasyTree from "@wchbrad/vue-easy-tree";
// 样式文件,可以根据需要自定义样式或主题
import "@wchbrad/vue-easy-tree/src/assets/index.scss"
import {debounce} from '@/shared/debounceAndtThrottle.js'
export default {
  name: 'SelectMutipleTree',
  components: {
    VueEasyTree
  },
  props: {
    treeData: {
      type: Array,
      required: true,
      default:[],
    },
    treeProps: {
      type: Object,
      default: function () {
        return {
          value: 'id',
          label: 'orgName',
          checkStrictly: true
        }
      }
    },
    checkedTreeData: {
      type: String,
      required: true
    },
    placeholder: {
      type: String,
      default: '请输入'
    },
    checkStrictly: {
      type: Boolean,
      default: false
    },
    loading: {
      type: Boolean,
      default: true
    },
    defaultCheckedKeys:{
      type: Array,
      default:() => {
        return []
      },
    }
  },
  data () {
    return {
      selectTreeFlag: false,
      filterText: '',
      filterText_:null,
      newArr:[]
    }
  },
  watch: {
    checkedTreeData: function (newValue) {
      if (!newValue) {
        this.$nextTick(() => {
          this.$refs.selectMutipleTree.setCheckedKeys([])
        })
      }
    },
    filterText(val) {
      this.filterText_(val)
    },
    treeData(val){
      var num = 0
      this.chuli(val,num)
    },
    defaultCheckedKeys(val){
      if(val.length == 0) {
        this.newArr =[]
      }else{
        this.chuliCheckedKeys(this.treeData, val)
      }
    }
  },
  methods: {
    chuliCheckedKeys(list, val){
      list.forEach(item => {
        val.forEach(i => {
          if(item[this.treeProps.value].split('-')[0] === i){
            i= item[this.treeProps.value]
            this.newArr.push(i)
          }
        })
        if(item[this.treeProps.children]){
          this.chuliCheckedKeys(item[this.treeProps.children], val)
        }
      })
    },
    chuli(list,num){
       list.forEach(i=>{
        num++
        i[this.treeProps.value] = i[this.treeProps.value] + "-" + num;
        if(i[this.treeProps.children]){
          this.chuli(i[this.treeProps.children],num)
        }
       })
    },
    handleCheck (checkedNodes, checkedKeys) {
      checkedKeys.checkedNodes.forEach((f) => {
         f[this.treeProps.value] =  f[this.treeProps.value].split('-')[0]
        });
      this.$emit('handleCheckData', checkedKeys.checkedNodes)
    },



    filterNode(value, data) {
      if (!value) return true;
      return data[this.treeProps.label].includes(value);

    }
  },
  created () {

  },
  mounted () {
    if (!this.checkedTreeData) {
      this.$nextTick(() => {
        this.$refs.selectMutipleTree.setCheckedKeys([])
      })
    }
    this.$refs.selectMutiple && this.$refs.selectMutiple.addEventListener('click', (event) => {
      const ev = event || window.event
      if (ev.stopPropagation) {
        ev.stopPropagation()
      } else {
        ev.cancelable = true
      }
       this.selectTreeFlag =  !this.loading && true
    })
    this.$root.$el.addEventListener('click', (event) => {
      this.selectTreeFlag = false
    })
    this.filterText_ = debounce((val)=>this.$refs.selectMutipleTree.filter(val), 1000)
  },
  destroyed () {

  }
}
</script>
<style lang="scss" scoped>
.scroll-container {
  max-height: 600px;
  overflow-y: auto;
  position: absolute;
  z-index: 10;
  width: 100%;
  border: 1px solid #eeeeee;
  border-top: none;
  background: #ffffff;
  ::v-deep {
    .el-scrollbar__wrap {
      overflow-x: hidden;
    }
  }
}
.sub-comments-leave-active,.sub-comments-enter-active {
    transition: max-height 0.1s linear;
}
.sub-comments-enter,.sub-comments-leave-to {
    max-height:0 ;
    opacity: 0;
}
.sub-comments-enter-to,.sub-comments-leave {
    max-height: 136px ;
}
</style>

3.具体页面该如何使用

<select-mutiple-tree  size="mini" style="display: inline-block" :treeData="organizationTree" :treeProps="releaseTreeProps" :loading="treeLoading" :checkedTreeData="addCaseForm.copyToUserListName" 
placeholder="请选择"  @handleCheckData="handleCheck" :checkStrictly="releaseTreeProps.checkStrictly">
</select-mutiple-tree>

1.data中定义
    organizationTree: [],
    treeLoading: true, //控制人员树加载状态
    releaseTreeProps: {
      value: "nodeIdAndType",
      label: "nodeName",
      children: "organizationTreeUserSingeNodeList",
      checkStrictly: false,
    },
    addCaseForm: {
      copyToUserListName:'',
      copyToUserList:[], //抄送人
    }
2.引入及注册
   import SelectMutipleTree from "@/components/selectMutipleTree";
   components:{SelectMutipleTree }
3.接口中写
    接口名字().then((response) => {
      const { data, success } = response;
      if (success) {
        this.organizationTree = data;
        this.treeLoading = false;
      } else {
        this.organizationTree = [];
        this.treeLoading = false;
      }
    }).catch((error) => {
        this.organizationTree = [];
        this.treeLoading = false;
    });
4.方法
    handleCheck(checkedData) {
      if (checkedData.length > 0) {
        // 集合
        var namesArr = [];
        var idsArr = [];
        var userName = [];
        checkedData.forEach((f) => {
          if (f.nodeType !== 0) {
            namesArr.push(f.nodeName);
            idsArr.push(f.nodeId)
            userName.push({
              id: f.nodeId,
              name: f.nodeName,
            });
          }
        });
        this.addCaseForm.copyToUserListName = namesArr.join(";");
        this.addCaseForm.copyToUserList = idsArr;
      } else {
        this.addCaseForm.copyToUserListName = '';
        this.addCaseForm.copyToUserList = [];
      }
    },
    

 5.具体返回的后台格式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/369231.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯嵌入式第七届真题(完成) STM32G431

蓝桥杯嵌入式第七届真题(完成) STM32G431 题目 相关文件 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body**********************…

layui-实现上下表,父子表单选加载事件

layui-实现上下表&#xff0c;父子表单选加载事件 代码HTML代码表格数据加载点击主表行&#xff0c;加载子表数据 实现效果图 代码 主子表&#xff0c;实现点击主表的单元格实现选中主表&#xff0c;并加载子表 HTML代码 //主表 <table class"layui-hide" id&q…

日志追踪-Tracing

1. 前言 分布式链路跟踪中有两个重要的概念&#xff1a;跟踪&#xff08;trace&#xff09;和 跨度&#xff08; span)。trace 是请求在分布式系统中的整个链路视图&#xff0c;span 则代表整个链路中不同服务内部的视图&#xff0c;span 组合在一起就是整个 trace 的视图在整个…

中科星图——Sentinel-1_SAR_GRD数据集

数据名称&#xff1a; Sentinel-1_SAR_GRD 数据来源&#xff1a; Copernicus 时空范围&#xff1a; 2022年8月-2023年2月 空间范围&#xff1a; 全国 数据简介&#xff1a; 哨兵1号&#xff08;Sentinel-1&#xff09;卫星是欧洲航天局哥白尼计划&#xff08;GMES&…

全球降水数据产品介绍

一、数据基本概况 降水数据在气象学、水文学、农业、生态学等领域有着广泛的用途。以下是一些降水数据的主要用途&#xff1a; 气象预报和监测&#xff1a; 降水数据是气象预报的重要组成部分&#xff0c;对预测天气、气候和自然灾害&#xff08;如暴雨、洪水&#xff09;至关…

day38 斐波那契数 爬楼梯 使用最小花费爬楼梯

题目1&#xff1a;509 斐波那契数 题目链接&#xff1a;509 斐波那契数 题意 斐波那契数列由0和1开始 后面的每一项数字都是前面两项数字之和 计算F(n) 动态规划 动规五部曲&#xff1a; 1&#xff09;dp数组及下标i的含义 dp[i] : 第i个斐波那契数值 i: 第i个斐…

使用 Visual Studio Code 在远程计算机上调试 PostgreSQL

使用 Visual Studio Code 在远程计算机上调试 PostgreSQL 1. 概述 PostgreSQL 是一个功能强大的开源关系数据库管理系统&#xff0c;适用于各种应用程序。在开发过程中&#xff0c;调试 PostgreSQL 对于识别和解决问题至关重要。在本博客中&#xff0c;我们将手把手教你使用客…

【考研408】操作系统笔记

文章目录 [toc] 计算机系统概述操作系统的基本概念操作系统的概念和特征操作系统的目标和功能&#xff08;**处理器管理、存储器管理、设备管理、文件管理、向用户提供接口、扩充机器**&#xff09; 操作系统的发展与分类操作系统的运行环境操作系统的运行机制 操作系统的体系结…

Node.js-1

Node.js 简介 定义&#xff1a;Node.js 是一个跨平台 JavaScript 运行环境&#xff0c;使开发者可以搭建服务器端的 JavaScript 应用程序 为什么 Node.js 能执行 JS 代码&#xff1a; Chrome 浏览器能执行 JS 代码&#xff0c;依靠的是内核中的 V8引擎&#xff08;即&#x…

【ELK】logstash快速入门

1.概述 1.1.什么是logstash&#xff1f; 之前我们聊了es&#xff0c;并且用docker搭建了一个eskibana的环境。es目前最普遍的用法是用来存储日志的&#xff0c;然后结合kibana对日志做一些可视化的工作。既然要收集日志&#xff0c;就面临着一个问题&#xff1a; 各个系统的…

Linux下新建用户

新建用户 sudo adduser -m username添加密码 sudo passwd username设置权限 sudo vi /etc/sudoers在user privilege这一行&#xff0c;仿照root&#xff0c;另起一行&#xff0c;添加上 设置命令解释器 sudo vi /etc/passwd找到新建用户名&#xff0c;将sh改为bash vi中…

基于知识图谱的少样本和零样本学习综述

论文题目&#xff1a;Zero-Shot and Few-Shot Learning With Knowledge Graphs: A Comprehensive Survey 本文作者&#xff1a;陈矫彦&#xff08;曼彻斯特大学&牛津大学&#xff09;、耿玉霞&#xff08;浙江大学&#xff09;、陈卓&#xff08;浙江大学&#xff09;、Je…

快速理解复杂系统组成学习内容整合

目录 一、复杂系统组成 二、接入系统 (Access System) 三、应用系统 (Application System) 四、基础平台 (Foundation Platform) 五、中间件 (Abundant External Middleware) 六、支撑系统 (Supporting System) 参考文章 一、复杂系统组成 复杂系统是由多个相互关联、相…

【Java程序设计】【C00245】基于Springboot的家政服务管理平台(有论文)

基于Springboot的家政服务管理平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的家政服务管理平台 本系统分为前台模块、管理员功能模块、用户功能模块以及服务人员功能模块。 前台模块&#xff1a;系统首页的…

【云原生】docker安全与https加密的超文本传输协议CA证书生成

目录 一、docker安全 二、http与https的区别 三、为什么要使用 SSL 证书&#xff1f; 四、https证书认证的过程 https单向认证的访问流程 https双向认证的访问流程 五、如何获取证书&#xff1f; 六、实操获取证书并验证 1、通过阿里云获取证书 2、通过mkcert获取证书…

【Vue3实战】TypeScript前端实战基础

【Vue3实战】TypeScript前端实战基础 前言一、TypeScript的由来二、什么是TypeScript?三、静态类型检查四、类型注解和类型推导五、可选参数和默认参数六、接口和类型别名接口接口的可选设置类型 七、类和继承接口的继承交叉类型模拟继承 八、泛型什么是泛型泛型接口泛型函数泛…

深度学习驱动下的自然语言处理进展及其应用前景

文章目录 每日一句正能量前言技术进步应用场景挑战与前景自然语言处理技术当前面临的挑战未来的发展趋势和前景 伦理和社会影响实践经验后记 每日一句正能量 一个人若想拥有聪明才智&#xff0c;便需要不断地学习积累。 前言 自然语言处理&#xff08;NLP&#xff09;是一项正…

LeetCode---382周赛---位运算

题目列表 3019. 按键变更的次数 3020. 子集中元素的最大数量 3021. Alice 和 Bob 玩鲜花游戏 3022. 给定操作次数内使剩余元素的或值最小 一、按键变更的次数 题目简单明了&#xff0c;就是看相邻的两个字母是否相等&#xff0c;不区分大小写&#xff0c;直接遍历统计即可…

Linux下tar命令详解

tar #归档命令 格式 • Tar -参数 [args]..... 参数&#xff1a; 必选参数&#xff1a; 辅助参数&#xff1a; 额外参数&#xff1a; # 打包时排除某个文件 tar cf 文件名.tar --exclude路径/文件 路径 注&#xff1a;此处的路径前后需要保持保持一致&#xff0c;统一…

【Langchain+Streamlit】打造一个旅游问答AI

利用LangchainStreamlit打造一个交互简单的旅游问答AI机器人&#xff0c;如果你有openai账号,可以按照如下的网址直接体验&#xff0c;如果你没有的话可以站内私信博主要一下临时key体验一下&#xff1a; 产品使用传送门—— http://101.33.225.241:8501/ 这里有演示效果和代码…