基于el-tree实现懒加载穿梭条的示例代码

 更新时间:2024年03月07日 10:07:49   作者:gyuhao_o  
这篇文章主要介绍了基于el-tree实现懒加载穿梭条的示例代码,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

一、关键代码 

<template>
  <div>
    <!-- 左侧待选列表 -->
    <div class="left-box">
      <p>待选列表</p>
      <el-input placeholder="输入关键词过滤" v-model="leftFilterText" clearable/>
      <el-tree
        ref="treeLeft"
        :data="leftData"
        show-checkbox
        node-key="id"
        props="defaultProps"
        :load="loadNode"
        lazy
        :filter-node-method="filterNode"  
      >
      </el-tree>
    </div>
    <!-- 穿梭按钮 -->
    <div class="oper-box">
      <el-button circle type="primary" icon="el-icon-arrow-left" @click="removeData"></el-button>
      <el-button circle type="primary" icon="el-icon-arrow-right" @click="addData"></el-button>
    </div>
    <div class="right-box">
      <p>已选列表</p>
      <el-input placeholder="输入关键词过滤" v-model="rightFilterText" clearable/>
      <el-tree
        ref="treeRight"
        :data="rightData"
        show-checkbox
        node-key="id"
        props="defaultProps"
        :filter-node-method="filterNode"  
      >
      </el-tree>
    </div>
  </div>
</template>
<script>
  data(){
    return {
      checkAll: false,
      leftFilterText: '',
      rightFilterText: '',
      defaultProps: {
        chilren: 'children',
        label: 'labelName',   // 适配后端下发的数据字段名
        isLeaf: 'leaf',   // leaf 字段判断节点是否为叶子节点
        // 配置禁选的节点
        disabled: function(data, node) {
          // 如这里配置父节点、带有disable属性的节点禁选
          if('children' in data || data.disable) {
            return true;
          } else {
            return false;
          }
        }
      },
      leftData: [],
      rightData: []
    }
  },
  watch: {
    leftFilterText(val) {
      this.$refs.treeLeft.filter(val);
    },
    rightFilterText(val) {
      this.$refs.treeRight.filter(val);
    }
  },
  methods: {
    // 根据关键词过滤节点
    filterNode(value, data) {
      if(!value) return true;
      // labeName 为defaultProps中配置的label值,未配置默认为label
      return data.labeName.indexOf(value) !== -1;
    },
    // 懒加载出树结构的最后一层节点
    async loadNode(node, resolve) {
      if(node.level === 0) {
        return resolve(node.data);   // 顶层数据默认展示
      } else {
        if(node.data.children && node.data.children.length > 0) {
          return resolve(node.data.children);
        } else {  // 最后一层数据,异步懒加载
          let tempData = await this.getDynamicData(node.data.id);
          return resolve(tempData);
        }
      }
    },
    // 获取数据接口
    getDynamicData(id) {
    },
    // 移除节点
    removeData() {
      // 右侧选中节点
      let removeKeys = this.$refs.treeRight.getCheckedKeys();
      this.rightData = this.rightData.filter(item => !removeKeys.includes(item.id));
      // 左侧:仅保留右侧列表中有的数据为勾选状态
      let leftCheckKeys = this.rightData.map(item => item.id);
      this.$refs.treeLeft.setCheckedKeys(leftCheckKeys);
    },
    // 添加节点
    removeData() {
      // 获取左侧选中节点,作为右侧的数据
      let checkNodes = this.$refs.treeLeft.getCheckedNodes();
      let checkKeys = this.$refs.treeLeft.getCheckedKeys();
      this.rightData = checkNodes;
    },
  }
</script>
 

🎨 过滤节点函数:filterNode

1、watch 监听关键词;filterNode 必须有返回值,否则数据显示不出来;

2、关键词不为空时,函数的返回值 data.labeName.indexOf(value) !== -1; 其中 labeName 为defaultProps中配置的label值,未配置默认为label

🎨 异步加载函数:loadNode

根据 node.level 去匹配数据层级,判断是否需要调用接口获取数据

🎨 样式自定义

二、最终效果:(效果图仅供参考)

(1) 左侧列表为树形结构,且最后一级节点懒加载;(数据量大时,可以有效提高加载速度)

(2)右侧选中的列表无树形结构,为左侧选中的所有节点

到此这篇关于基于el-tree实现懒加载穿梭条的文章就介绍到这了,更多相关el-tree懒加载穿梭条内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Ant design vue table 单击行选中 勾选checkbox教程

    Ant design vue table 单击行选中 勾选checkbox教程

    这篇文章主要介绍了Ant design vue table 单击行选中 勾选checkbox教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • vue自定义标签和单页面多路由的实现代码

    vue自定义标签和单页面多路由的实现代码

    这篇文章主要介绍了vue自定义标签和单页面多路由的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 深入解析el-col-group强大且灵活的Element表格列组件

    深入解析el-col-group强大且灵活的Element表格列组件

    这篇文章主要为大家介绍了el-col-group强大且灵活的Element表格列组件深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 解读vant的Uploader上传问题

    解读vant的Uploader上传问题

    这篇文章主要介绍了解读vant的Uploader上传问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)

    浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)

    这篇文章主要介绍了浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • VSCode中书写Vue无代码提示该如何解决

    VSCode中书写Vue无代码提示该如何解决

    vscode开发vue非常好用,因为有很多的插件,可以补全语法,或者高亮便于检查错误,但我最近发现我的vscode却没有了代码提示,这篇文章主要给大家介绍了关于VSCode中书写Vue无代码提示该如何解决的相关资料,需要的朋友可以参考下
    2022-12-12
  • 详解vue组件之间的通信

    详解vue组件之间的通信

    这篇文章主要介绍了vue组件之间的通信,帮助大家更好的理解和学习前端的相关知识,感兴趣的朋友可以了解下
    2020-08-08
  • 关于vue属性使用和不使用冒号的区别说明

    关于vue属性使用和不使用冒号的区别说明

    这篇文章主要介绍了关于vue属性使用和不使用冒号的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Vue中$router和$route的区别详解

    Vue中$router和$route的区别详解

    在 Vue.js 中,$router 和 $route 是两个常用的对象,用于处理路由相关的操作,下面小编就来和大家介绍一下$router 和 $route 的区别以及如何使用它们吧
    2023-06-06
  • vue-router中query取值的坑及解决

    vue-router中query取值的坑及解决

    这篇文章主要介绍了vue-router中query取值的坑及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论