iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >基于vue如何实现tree插件
  • 880
分享到

基于vue如何实现tree插件

2024-04-02 19:04:59 880人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关基于Vue如何实现tree插件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。iview提供的控件iview已经很成熟了,如果说我写的控件和iv

这篇文章将为大家详细讲解有关基于Vue如何实现tree插件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

iview提供的控件

iview已经很成熟了,如果说我写的控件和iview提供的控件谁更好,那肯定是选择iview , 手写控件只是为了更好的了解vue父子组件之间的通信的。 请读者还是不要拿我的控件和iview或者其他第三方的去对比。下面我们先来看看iview的Tree控件如何使用

<template>
  <Tree :data="data2" show-checkbox></Tree>
</template>

<script>
  export default {
    data () {
      return {
        data2: [
          {
            title: 'parent 1',
            expand: true,
            children: [
              {
                title: 'parent 1-1',
                expand: true,
                children: [
                  {
                    title: 'leaf 1-1-1'
                  },
                  {
                    title: 'leaf 1-1-2'
                  }
                ]
              },
              {
                title: 'parent 1-2',
                expand: true,
                children: [
                  {
                    title: 'leaf 1-2-1'
                  },
                  {
                    title: 'leaf 1-2-1'
                  }
                ]
              }
            ]
          }
        ]
      }
    }
  }
</script>

上述的代码形成的效果如下

基于vue如何实现tree插件

在使用Tree控件时在Template中还有如下树形可以使用(根据自己需求)

基于vue如何实现tree插件

然后就是控件的一些事件捕获

基于vue如何实现tree插件

子节点的一些设置

基于vue如何实现tree插件

对于iview的Tree总结就是一句话:到位!。在这里小编也推荐大家使用iview来开发。这个框架对于后端程序员来说是个福利。因为我们不需要了解太专业的前端的只是就能够满足80%的需求了。

手写控件

同样的我们先来看看他的用法其实和iview一样。用我们封装好的模板就行了。下面是做一个部门树。部门下面挂着人员这个功能。

<zxhtree
    v-if="userChange"
    class="item"
    treekey="deptId"
    treename="deptName"
    treechildren="children"
    :model="deptData"
    :ids="sysUserRole.deptIds"
    :names="sysUserRole.deptNames"
    @keyname="selectedUserObj"
>
</zxhtree>

js就是去填补上述的数据,比如deptData、sysUserRole这些。至于这些属性代表什么意思我们先不着急看。先上个效果图。

基于vue如何实现tree插件

那么我们的zxhtree控件是在哪里注册的呢,这里被我们抽离在component.js里。Vue.component('zxhtree', {});
继续在zxhtree里看除绑定的节点是template: '#tree-template'
tree-template的模板是在component.html中写好的

<script type="text/x-template" id="tree-template">
  <div>
    <tree-item
        class="item"
        :treekey="treekey"
        v-for="(model, index) in model"
        :treename="treename"
        :treechildren="treechildren"
        :model="model"
        :ids="ids"
        :names="names"
        @keyname="selectedObj"
        @data="synchdata"
    >
    </tree-item>
  </div>
</script>

而在tree-template用到的tree-item控件才是真正的tree控件。这里是为了将树形包裹起来,所以才包裹了一层模板。
tree-item对应的模板代码是

<script type="text/x-template" id="item-template">
  <ul class="ztree">
    <li class="level0" @blur="blur" @focus="focus" tabindex="0" hidefocus="true" treenode="">
      <input type="checkbox" :disabled="model.disabled" :ref="model[treename]" :checked="checkStatus" @click="selectedObj"/>
      <span title="" @click="toggle" :class="openStatus" treenode_switch=""></span>
      <a :class="selectClass" treenode_a="" onclick="" target="_blank"  :title="model[treename]">
        <span title="" treenode_ico="" class="button ico_open" ></span>
        <span @dblclick="toggle" class="node_name">{{model[treename]}}</span>
      </a>
      <tree-item
        class="item"
        v-show="open"
        v-for="(model, index) in model[treechildren]"
        :key="index"
        :model="model"
        :treekey="treekey"
        :treename="treename"
        :vistreekey="vistreekey"
        :vistreename="vistreename"
        :treechildren="treechildren"
        ref="child"
        @keyname="keyname"
      >
      </tree-item>
    </li>
  </ul>
</script>

可以很明显的看到这里我们使用了递归进行展示树形结构。因为树形结构你无法确定层级。所以在里面又使用了针对子节点的展示tree-item.

属性含义示例
treekey内部树形展示deptId
vistreekey树形展示keydeptId
ids默认显示的数据
names默认显示的数据
treename内部真是展示数据deptName
vistreename树形展示数据deptName
treechildren当前树的子节点数据
model当前树的数据
(M)keyname用于接受返回的数据

手写控件扩展

控件接受数据处理逻辑

//接收到数据在外面套一层
if(this.model[this.treekey]==undefined){
  this.treekey=this.vistreekey;
}
if(this.model[this.treename]==undefined){
  this.treename=this.vistreename;
}
if (this.model.disabled == true) {
  this.model.disabled = 'disabled';
}
console.log('组件注册了吗');
if ((','+this.ids+',').indexOf(','+this.model[this.treekey]+',') == -1) {
  this.checkStatus = false;
  this.model.checkStatus=this.checkStatus;
} else {
  this.checkStatus=true;
  this.model.checkStatus=this.checkStatus;
  this.treekeys[this.model[this.treekey]]= this.checkStatus;
  this.treenames[this.model[this.treename]]= this.checkStatus;
  this.opt.key=this.treekeys;
  this.opt['name']=this.treenames;
}
if(this.ids!=''){
  var idarr = this.ids;
  for(var index in idarr){
    this.treekeys[idarr[index]]=true;
  }
  if (this.names.indexOf(",") == -1&&this.names!='') {
    this.treenames[this.names]=true;
  }else{
    var namearr = this.names.split(",");
    for(var index in namearr){
      this.treenames[namearr[index]]=true;
    }
  }
}

渲染默认数据

var newOpt ={'key':{},'name':{}};
  newOpt.key = Object.assign(this.opt.key, opt.key);
  newOpt.name = Object.assign(this.opt.name, opt.name);
  var flag=false;
  for(var index in this.model[this.treechildren]){
    if(newOpt.key[this.model[this.treechildren][index][this.treekey]]!=true){
      flag=true;
    }
  }
  if(!flag){
    newOpt.key[this.model[this.treekey]]=true;
    newOpt.name[this.model[this.treename]]=true;
    this.checkStatus=true;
    this.model.checkStatus=true;
  }
  for(var key in newOpt){
    this.filterRealCheck(newOpt[key]);
  }
  this.opt=newOpt;
  this.$emit('keyname', newOpt);

选择节点数据处理

if(selected instanceof MouseEvent){
  this.checkStatus=!this.checkStatus;
}else{
  this.checkStatus=selected;
}

this.model.checkStatus=this.checkStatus;
if (this.model.expected != true) {
  this.treekeys[this.model[this.treekey]]= this.checkStatus;
  this.treenames[this.model[this.treename]]= this.checkStatus;
  this.opt.key=this.treekeys;
  this.opt['name']=this.treenames;
}
for(var index in this.$refs.child){
  this.$refs.child[index].selectedObj(this.checkStatus);
}

this.$emit('keyname', this.opt);

关于“基于vue如何实现tree插件”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 基于vue如何实现tree插件

本文链接: https://www.lsjlt.com/news/78518.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于vue如何实现tree插件
    这篇文章将为大家详细讲解有关基于vue如何实现tree插件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。iview提供的控件iview已经很成熟了,如果说我写的控件和iv...
    99+
    2022-10-19
  • 如何基于LSM-tree架构实现一写多读
    一  前言 PolarDB是阿里巴巴自研的新一代云原生关系型数据库,在存储计算分离架构下,利用了软硬件结合的优势,为用户提供具备极致弹性、海量存储、高性能、低成本的数据库服务。X-Engine是阿里巴巴自研的新一代存储引擎,作为AliSQ...
    99+
    2016-12-28
    如何基于LSM-tree架构实现一写多读
  • vue基于Teleport如何实现Modal组件
    这篇文章将为大家详细讲解有关vue基于Teleport如何实现Modal组件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.认识Teleport像我们如果写Modal组件、Message组件、Loadi...
    99+
    2023-06-15
  • vue基于element-china-area-data插件实现省市区联动
    目录前言安装代码样例案例省市二级联动(不带“全部”选项):省市二级联动(带“全部”选项):省市三级联动(不带“全部&rdq...
    99+
    2022-11-13
  • Vue组件tree如何实现树形菜单
    这篇文章主要为大家展示了“Vue组件tree如何实现树形菜单”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue组件tree如何实现树形菜单”这篇文章吧。vue...
    99+
    2022-10-19
  • vue基于Teleport实现Modal组件
    目录1.认识Teleport2.Teleport的基本用法 3.第一步优化 4.第二步优化 5.实现Modal组件 1.认识Teleport 像我们如果写Modal组件、Messag...
    99+
    2022-11-12
  • 基于MybatisPlus插件TenantLineInnerInterceptor如何实现多租户功能
    这篇文章主要介绍基于MybatisPlus插件TenantLineInnerInterceptor如何实现多租户功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!多租户技术的基本概念:多租户技术(英语:multi-t...
    99+
    2023-06-21
  • vue基于element-china-area-data插件怎么实现省市区联动
    本篇内容主要讲解“vue基于element-china-area-data插件怎么实现省市区联动”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue基于element-china-area-da...
    99+
    2023-06-30
  • 基于DOM+CSS3如何实现OrgChart组织结构图插件
    这篇文章主要为大家展示了“基于DOM+CSS3如何实现OrgChart组织结构图插件 ”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“基于DOM+CSS3如何实现...
    99+
    2022-10-19
  • xmlplus如何实现Tree组件
    这篇文章给大家分享的是有关xmlplus如何实现Tree组件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。树形组件是一种具有层级结构的组件,广泛应用于各种场景。数据源树形组件的数...
    99+
    2022-10-19
  • 基于MybatisPlus插件TenantLineInnerInterceptor实现多租户功能
    多租户技术的基本概念: 多租户技术(英语:multi-tenancy technology)或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或...
    99+
    2022-11-12
  • Vue3基于countUp.js实现数字滚动的插件
    目录countUp 简介countUp 组件封装文末countUp 简介 CountUp.js 是一种无依赖项的轻量级 JavaScript 类,可用于快速创建以更有趣的方式显示数字...
    99+
    2023-05-17
    Vue3 countUp.js数字滚动 Vue3 数字滚动
  • vue+elementUI组件tree如何实现单选加条件禁用
    目录vue+elementUI组件tree单选加条件禁用使用如上方法就可以完成实现单选完结!付上一个完成的代码~vue+elementUI组件tree单选加条件禁用 elementU...
    99+
    2022-11-13
  • 如何基于jQuery插件jqzoom实现的图片放大镜效果
    这篇文章主要介绍如何基于jQuery插件jqzoom实现的图片放大镜效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!jqzoom插件实现图片放大镜效果。图1.1jqzoom插件实现...
    99+
    2022-10-19
  • 如何通过vue封装tree组件实现搜索功能
    本篇文章和大家了解一下如何通过vue封装tree组件实现搜索功能。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。我使用的是 vue2 + antd, 那么 antd 的 tree 组件中没有给我们封装搜索,其官网提供的搜索...
    99+
    2023-07-06
  • 基于flutter sound插件实现录音与播放功能
    目录插件介绍:插件信息:插件使用前的准备工作设置麦克风权限描述权限管理插件 permission_handler音频硬件配置插件 audio_session动画插件常用的方法录音常见...
    99+
    2022-11-13
  • Vue基于Element-ui实现表格弹窗组件
    本文实例为大家分享了Vue基于Element-ui实现表格弹窗组件的具体代码,供大家参考,具体内容如下 效果图 使用方式 acTable1 () {   this.$modalTa...
    99+
    2022-11-13
  • ThinkPHP基于think-queue的队列插件实现消息推送
    目录前言安装搭建消息队列的存储环境消息的创建与推送消息的消费与删除发布任务处理任务think-queue是ThinkPHP官方提供的一个消息队列服务,是专门支持队列服务的扩展包。th...
    99+
    2022-12-14
    thinkphp think-queue 消息推送
  • 基于rabbitmq延迟插件实现分布式延迟任务
    目录一、延迟任务的使用场景二、组件安装三、RabbitMQ延迟队列插件的延迟队列实现1、基本原理2、核心组件开发走起之前给大家介绍过SpringBoot集成Redisson实现延迟队...
    99+
    2022-11-12
  • vue如何实现一个弹窗插件
    这篇文章主要讲解了“vue如何实现一个弹窗插件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue如何实现一个弹窗插件”吧!popup.vue<template> &l...
    99+
    2023-07-04
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作