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

 更新时间:2022年07月21日 10:38:56   作者:骑上我心爱的小摩托  
这篇文章主要介绍了如何隐藏element-ui中tree懒加载叶子节点checkbox(分页懒加载效果),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

根据最新的工作需求中指示,要求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

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

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

相关文章

  • vue生命周期和react生命周期对比【推荐】

    vue生命周期和react生命周期对比【推荐】

    本文通过实例代码给大家介绍了vue生命周期和react生命周期对比 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • Vue如何将当前窗口截图并将数据base64转为png格式传给服务器

    Vue如何将当前窗口截图并将数据base64转为png格式传给服务器

    这篇文章主要介绍了Vue如何将当前窗口截图并将数据base64转为png格式传给服务器,通过实例代码介绍了将当前窗口截图,并将数据存储下来,需要的朋友可以参考下
    2023-10-10
  • Element UI 上传组件实现文件上传并附带额外参数功能

    Element UI 上传组件实现文件上传并附带额外参数功能

    在使用 ElementUI 的上传组件 el-upload 实现文件上传功能时,如果单文件上传是比较简单的,但是在实际需求中,往往会在上传文件时伴随着一些其他参数,怎么操作呢,下面通过示例代码讲解感兴趣的朋友一起看看吧
    2023-08-08
  • VUE使用 wx-open-launch-app 组件开发微信打开APP功能

    VUE使用 wx-open-launch-app 组件开发微信打开APP功能

    这篇文章主要介绍了VUE使用 wx-open-launch-app 组件开发微信打开APP功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 一文搞懂Vue中computed和watch的区别

    一文搞懂Vue中computed和watch的区别

    这篇文章主要和大家详细介绍一下Vue中computed和watch的使用与区别,文中通过示例为大家进行了详细讲解,对Vue感兴趣的同学,可以学习一下
    2022-11-11
  • Vue新一代状态管理工具Pinia的具体使用

    Vue新一代状态管理工具Pinia的具体使用

    本文主要介绍了Vue新一代状态管理工具Pinia的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • SSM VUE Axios详解

    SSM VUE Axios详解

    Axios是在前端开发中常用的一个发送 HTTP 请求的库,用过的都知道,篇文章主要给大家介绍了关于vue的相关资料,需要的朋友可以参考下
    2021-10-10
  • 如何使用vue开发公众号网页

    如何使用vue开发公众号网页

    因为项目需要,近期做了一个公众号网页开发。在此期间也踩了一些坑,解决这些坑之后,准备对这个项目进行复盘。记录下项目从开发到上线所解决的问题,并对使用vue进行公众号开发的步骤进行一个总结。方便以后有问题进行查阅。希望对你有所帮助
    2021-05-05
  • 解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题

    解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题

    这篇文章主要介绍了解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • vue动态添加表单validateField验证功能实现

    vue动态添加表单validateField验证功能实现

    这篇文章主要介绍了vue动态添加表单validateField验证功能实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04

最新评论