如何隐藏element-ui中tree懒加载叶子节点checkbox(分页懒加载效果)

目录
  • 1.首先按照官网
  • 2.由于属性是isleaf
  • 3. 分页懒加载实现功能也比较简单

根据最新的工作需求中指示,要求Tree树组件为lazy懒加载,且能够进行复选框选择,这个实现简单,设置show-checkbox即可,若此处要求叶子节点也不能包含复选框,就有些困扰了

1.首先按照官网

拷贝tree树组件代码,设置完show-checkbox,图中查看更多为叶子节点,且设置数据节点属性为disabled

<el-tree
      ref="treeRef"
      class="treeDom"
      lazy
      show-checkbox
      :props="defaultProps"
      highlight-current="true"
      :load="lazyLoadMore"
      :expand-on-click-node="false"
      :default-expanded-keys="defaultExpandKeys"
      :default-checked-keys="defaultCheckedKeys"
      node-key="id"
      @node-expand="handleNodeExpand"
      @node-collapse="handleNodeCollapse"
      @node-click="handleNodeClick"
      @check="handleCheck"
    >
      <div slot-scope="{ node, data }" class="custom-tree-node">
        <!-- 查看更多 -->
        <span
          v-if="data.id ==='loadmore'"
          class="tree-node loadmore"
          @click="loadMoreNode(node,data)"
        >
          <el-link>{{ node.label }}</el-link>
        </span>
        <!-- 数据到底了 -->
        <span
          v-if="data.id ==='disabledload'"
          class="tree-node no-data"
          style="color: #999; cursor: auto;"
        >
          {{ node.label }}
        </span>
        <!-- 普通节点 -->
        <el-tooltip
          class="item"
          effect="light"
          placement="right-start"
        >
          <div slot="content" style="max-width: 300px;">
            {{ node.label }}
          </div>
          <span v-if="data.id !=='loadmore' && data.id!=='disabledload'" class="span-tree-node" @click="loadMoreNode(node,data)">{{ node.label }}</span>
        </el-tooltip>
      </div>
    </el-tree>

css样式如下:

::v-deep .span-tree-node {
  width: 120px;
  position: absolute;
  text-overflow: ellipsis;
  overflow: hidden;
  color: #696969;
  top: 50%;
  transform: translateY(-50%);
}
::v-deep .treeDom {
  width: 100%;
  overflow-x: auto;
  .custom-tree-node {
    width: 100% !important;
    position: relative;
  }

2.由于属性是isleaf

所以lazy状态下叶子节点不会有加载目录符号,但此时,有个禁用复选框,现在只需要对它设置样式即可

::v-deep .el-tree .el-tree-node:last-child {
  .el-tree-node__content .is-leaf +.el-checkbox.is-disabled{
    display: none;
  }
  .el-tree-node__content.is-not-clickable{
    cursor: pointer;
  }
}

3. 分页懒加载实现功能也比较简单

可以复写tree树自带的load方法,load方法内携带两个返回参数,一个是node,一个是resolve,即懒加载数据必须是通过resolve就是return 将数据带回

    async lazyLoadMore(node, resolve, parentNode = []) {
      let id = node?.data?.id, pre = node?.data?.name, data = [], arrId = '';
      if (node.level === 0) {
        id = this.paramNode.parent;
        return resolve([{id: id, name: id, leaf: false}]);
      }
      if (node.level === 1) {
        pre = '';
      }
      // 节点各自的resolve
      this.funcResolve.push({id: id, resolve: resolve});
      this.funcResolve = this.funcResolve.filter((item, index, self)=>{
        return self.findIndex(x=>x.id === item.id) === index;
      });
      // 判断获取分页查询的pre参数
      if (id && id.indexOf('/') > -1) {
        let arrIndex = id.lastIndexOf('/') + 1;
        arrId = id.substring(arrIndex);
        if (arrId === pre) pre = '';
      }
      // lazy加载查询接口
      const { data: {items} } = await getInterfaceTreeDictory({parent: id || '', pre: pre || ''});
      data = items.map(({interface_url: name, full_interface_url: id}) => {
        return {name, id};
      });
      // 翻页信息添加
      if (data.length >= this.pageSize) {
        let nearName = data[data.length - 1].name;
        data.push({name: '查看更多', id: 'loadmore', nearName: nearName, leaf: true, disabled: true});
      }
      // 查看更多加载需根据各自的resolve加载数组数据
      if (parentNode && parentNode.length > 0) {
        parentNode.push(...data);
        return resolve(parentNode);
      } else {
        return resolve(data);
      }
    },
    // 查看更多事件点击
    loadMoreNode(node, data) {
      if (data.id === 'loadmore') {
        let nodeParentKey = node.parent.key ? node.parent.key : this.paramNode.parent;
        let childNode = {
            data: {
              id: nodeParentKey,
              name: data.nearName
            }
          }, resolve = '';
        let parentNode = node.parent.childNodes.map(({key: id, label: name})=>{
          return { name, id };
        });
        console.log(parentNode);
        // 剔除自定义查看更多option数据
        if (parentNode.length > 0) {
          parentNode = parentNode.slice(0, -1);
        }
        // 选取resolve返回
        if (parentNode.length <= this.pageSize) {
          resolve = this.funcResolve.filter((item)=>{
            return item.id === nodeParentKey;
          });
          // 调用原生Tree load方法
          this.$refs.treeRef.load(childNode, resolve[0].resolve, parentNode);
        }
      }
    },

代码内有一点需要注意,即每次查询接口的时候,和后台约定的规则是:不包含分页,需要传值两个参数,一个是parent,即当前节点的上一级所有层级拼接,另一个是pre即当前节点的子集,若第一次加载,pre可为空,若查看更多再一次加载pre为上一次加载数据data的最后一个元素id,作为传参;

eg:

  • a、此时需要点击加载js,即 GET请求下param参数如下parent=172.24.114.143:8080/js&pre=

  • b、此时继续点击查看更多,则传入parent=172.24.114.143:8080/js&pre=jquery-showloading

到此代码和效果都正常了~

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作

    需求: vue-cli项目树形控件:一级节点为本地节点,默认展开一级节点,增删改后局部刷新数据. 增加节点,点击确定后局部刷新,渲染新数据. 源码 element组件样式 <el-tree class="treeitems" :data="data" node-key="id" :props="defaultProps" :load="loadNode" lazy :default-expanded-

  • Vue elementUI实现树形结构表格与懒加载

    目录 1.实现效果 2.后端实现 2.1 实体类 2.2 数据库中的数据结构 2.3 后端接口 2.4 swagger测试后端结构功能是否正常 3.前端实现 3.1 页面中引入el-table组件 3.2 实现效果 1.实现效果 2.后端实现 2.1 实体类 @Data @ApiModel(description = "数据字典") @TableName("dict") public class Dict { private static final long se

  • 基于element-ui封装可搜索的懒加载tree组件的实现

    引言 最近开发项目时遇到一个需求就是采用tree的方式展示以万为单位的数据,因为数据量大第一反应就是采用"懒加载"的方式实现,为了方便用户在庞大的数据量中快速定位到某个节点搜索功能也是必不可少的:因为采用"懒加载"数据,搜索当然也是远程搜索了:确定了需求当然第一时间就去网上找有没有小伙伴已经实现了相关组件,最后....,还是自己实现一个吧(由于公司采用的element-ui所以基于el-tree进行改造):[这只是自己实现的一种思路,希望大家多多指正] 1.懒加载树

  • 详解如何实现Element树形控件Tree在懒加载模式下的动态更新

    Element提供的Tree树形控件,可以用清晰的层级结构展示信息,还可以展开或折叠.Tree支持两种加载模式:一次性加载全部树节点和懒加载模式.所谓懒加载模式,是指当需要展开父节点时才渲染子节点.懒加载模式的应用场景适合树节点数据量大的情形,在一定程度上可以优化图形用户界面的响应效率以及提升用户体验.但是,懒加载模式对数据动态刷新应用需求的支持不尽如意.树形控件节点一旦展开就缓存在本地,后续不会再继续更新和刷新节点数据.本文将介绍如何实现Element树形控件Tree在懒加载模式下的动态更新.

  • 如何隐藏element-ui中tree懒加载叶子节点checkbox(分页懒加载效果)

    目录 1.首先按照官网 2.由于属性是isleaf 3. 分页懒加载实现功能也比较简单 根据最新的工作需求中指示,要求Tree树组件为lazy懒加载,且能够进行复选框选择,这个实现简单,设置show-checkbox即可,若此处要求叶子节点也不能包含复选框,就有些困扰了 1.首先按照官网 拷贝tree树组件代码,设置完show-checkbox,图中查看更多为叶子节点,且设置数据节点属性为disabled <el-tree ref="treeRef" class="tr

  • element UI 中的 el-tree 实现 checkbox 单选框及 bus 传递参数功能

    el-tree 单选功能 在日常项目开发中,会经常遇到,树形结构的查询方式,为了快速方便开发,常常会使用到快捷的ui组件去快速搭树形结构,这里我用的是 element ui 中的 el-tree .第一次接触这种功能的时候也是各种网站查询,虽然也都能实现功能,但是都会有一些小问题,就很难受,那么我们废话不多说(好像也说了不少呢),直接上效果. el-tree 单选 html 代码 *** 注: load 和 lazy 属性不是需要的粘贴时请删除.(只有需要懒加载的树才需要,关于怎样构建懒加载树以

  • Web Components实现类Element UI中的Card卡片

    目录 引言 Web Components 核心组成 1. Custom Elements 2. Shadow DOM 3. templates 和 slots 完整代码 Web Components vs Vue Components Web Components 生命周期回调函数 优点 and 缺点 七.基于web components的框架 引言 Web Components 是一个浏览器原生支持的组件化方案,允许你创建新的自定义.可封装.可重用的HTML 标记.不用加载任何外部模块,直接就

  • Element UI中table单元格合并的解决过程

    目录 引言 解决思路: 1.格式化后台返回的数据(根据实际数据格式处理) 2.在 data 中定义数据,需要合并几列就定义几个数组和索引 3.定义合并函数 4.table 组件属性 span-method 的单元格合并方法: 完整代码: 总结 引言 项目中遇到表格单元格合并的需求,在此记录整个解决过程. 项目使用的是 Element UI,表格使用的是 table 组件.Element UI 的 table 表格组件中对单元格进行合并,需要使用 table 组件的 span-method 属性.

  • Element UI中v-infinite-scroll无限滚动组件使用详解

    目录 一.v-infinite-scroll无限滚动组件使用详解 二.组件无限加载原因及解决方式 三.总结 总结 一.v-infinite-scroll无限滚动组件使用详解 1.v-infinite-scroll="load" //load无限滚动加载的方法 2.infinite-scroll-disabled //是否禁用无限滚动加载 3.infinite-scroll-delay //节流时延,单位为ms 4.infinite-scroll-distance //触发加载的距离阈值

  • vue2.0 + element UI 中 el-table 数据导出Excel的方法

    1.安装相关依赖 主要是两个依赖 npm install --save xlsx file-saver 如果想详细看着两个插件使用,请移步github. https://github.com/SheetJS/js-xlsx https://github.com/eligrey/FileSaver.js 2.组件里头引入 import FileSaver from 'file-saver' import XLSX from 'xlsx' 3.组件methods里写一个方法 exportExcel

  • 关于element ui中el-cascader的使用方式

    目录 element ui中el-cascader使用 例→ 代码 element中el-cascader使用及自定义key名 element ui中el-cascader使用 要想实现进入页面直接选中选择器中的选项 例→ 那v-model绑定的值必须是数组形式的!!(element ui官方文档中没提到这一点好像,我也是试了很多次才发现的) 代码 <el-form-item label="分类:" prop="region" class="regi

  • element UI中在 el-select 与 el-tree 结合组件实现过程

    前言 项目上实现某个功能,使用到了 el-select 和 el-tree 组合实现,记录下两者结合的实现过程. 要求根据项目接口提供的数据,el-tree 里的数据是一次性返回来的,点击最后一层级时,请求接口,在点击层级下方追加数据追加的数据要显示勾选框,可进行勾选,且是单选勾选后需要返回勾选的层级以及它的父级 实现效果如下: 数据回显效果: 实现关键部分 el-tree里的显示勾选框不符合当前“追加的数据要显示勾选框,可进行勾选”这个需求,所以我修改了el-tree的源码进行使用. 追加子级

  • vue3.0安装Element ui及矢量图使用方式

    在此只关注v3的安装及使用,如果想了解v2可移步到其官网:https://element.eleme.io/#/zh-CN/component/installation v3官网:https://element-plus.org/zh-CN/guide/installation.html 使用element ui时vue2和vue3的区别 安装命令 main.js中引入文件有所不同 使用icon时v2不需要安装,v3需安装 v2和v3在vue文件中使用icon时编写方式有所不同 icon在v2中

  • Vue+Element UI 实现视频上传功能

    一.前言 项目中需要提供一个视频介绍,使用户能够快速.方便的了解如何使用产品以及注意事项. 前台使用Vue+Element UI中的el-upload组件实现视频上传及进度条展示,后台提供视频上传API并返回URL. 二.具体实现 1.效果图展示 2.HTML代码 <div class="album albumvideo"> <div> <p class="type_title"> <span>视频介绍</spa

随机推荐