前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >el-tree的实现叶子节点单选

el-tree的实现叶子节点单选

作者头像
猫老师的叶同学
发布于 2023-03-01 05:52:57
发布于 2023-03-01 05:52:57
2.2K00
代码可运行
举报
文章被收录于专栏:中间件的探究中间件的探究
运行总次数:0
代码可运行

el-tree的实现叶子节点单选

效果

要求:火车的【硬座】和【软卧】只有选择一个。

实现效果:【上半年度出行】和【下半年度出行】的火车等级每个只能选择一项。

1、首先查看官网

进入Element官网查看 选择案例并粘贴到本地IDE中。

源码放到文末

2、熟悉基本的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<el-tree
      :data="data"
      show-checkbox
      default-expand-all
      node-key="value"
      ref="tree"
      empty-text="no data"
      :check-on-click-node="true"
      highlight-current
      @check="changeTree"
      :props="defaultProps">
</el-tree>        
data() {
   return {
     data: [...],
     // 设置每个节点的属性
     defaultProps: {
       children: 'children',
       label: 'label',
       id: 'value',
       disabled: 'selectable'
     }
   };
},
2.1、参数说明:defaultProps

children: 设置子节点的数组名称 label: 树节点显示名称 id: 树节点的ID (不可以重复) disabled: 是否可以被选中

2.2、对应的数据结构
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data() {
    return {
      data: [{
        value: '001',
        label: '上半年度出行',
        selectable: 'false',
        children: [{}]
      },{
        value: '002',
        label: '下半年出行',
        selectable: 'false', // 注意这里是字符串,'false'
        children: [{
          value: '002-101',
          label: '火车',
          selectable: 'false',
          children: [{}]
        }]
      }],
      // 设置每个节点的属性
      defaultProps: {
        children: 'children',
        label: 'label',
        id: 'value',
        disabled: 'selectable'
      }
    };
2.3、为什么要使用disabled属性呢?

思路:三层数据数据,叶子节点实现单选,但是如果点击父节点时,会实现叶子节点的全选,需要进行更多的数据处理。因此为了解决这个麻烦。引入disabled属性,让第一级和第二级为不可选中,只有叶子节点可以点击选中,这样来减少数据的判断。

实现效果:

3、添加check事件,实现单选。

每次点击树节点选框,出发check事件changeTree。此时存在两种情况,情况一:点击选中;情况二:点击取消。 情况一: 点击选中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 处理选择数据
    changeTree(data, list){
      console.log(data);   // {value: '002-101-301', label: '硬座'}
      console.log(list);   // {checkedKeys: ['002-101-301']}
      // 1、判断是选中/取消选中操作 checked: -1表示取消选中,否则为选中
      let checkedKeys = list.checkedKeys;
      console.log(checkedKeys)  // ['002-101-301']
      let checked = checkedKeys.indexOf(data.value);  // data.value  : 002-101-301
      console.log(checked);  // 0    ps: 返回-1时,表示数组不存在某个元素
      // 2、选中则判断
      if(checked !== -1){
        let prefix = data.value.substring(0, 8);  // '002-101-' 截取父节点的ID
        let list = checkedKeys.filter( item => {
          // 根据父节点的ID判断,这个节点下有多少个子节点; item.length < 8: 删除所有的父节点
          return item.indexOf(prefix) !== -1 || item.length < 8;
        });
        console.log(list); // ['002-101-301']
        // 如果一个父节点下选中多个子节点,删除子节点并重新赋值。
        if(list.length !== 1){ // 
          list.forEach(item => {
            let index = checkedKeys.indexOf(item);
            checkedKeys.splice(index, 1);
          });
          checkedKeys.push(data.value)
        }
        // 结果
        console.log(checkedKeys); // ['002-101-301']
        // 重复赋值
        this.$refs.tree.setCheckedKeys(checkedKeys);
      }
    },

**情况二:**单选切换

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 处理选择数据
    changeTree(data, list){
      // {value: '002-101-302', label: '硬座'}
      console.log(data);
       // {checkedKeys: ['002', '002-101', '002-101-301','002-101-302']}
      console.log(list);  
      // 1、判断是选中/取消选中操作 checked: -1表示取消选中,否则为选中
      let checkedKeys = list.checkedKeys;
      // ['002', '002-101', '002-101-301','002-101-302']
      console.log(checkedKeys)
      let checked = checkedKeys.indexOf(data.value);
      console.log(checked);  // 3    ps: 返回-1时,表示数组不存在某个元素
      // 2、选中则判断
      if(checked !== -1){
        let prefix = data.value.substring(0, 8);  // '002-101-' 截取父节点的ID
        let list = checkedKeys.filter( item => {
          // 根据父节点的ID判断,这个节点下有多少个子节点; item.length < 8: 删除所有的父节点
          return item.indexOf(prefix) !== -1 || item.length < 8;
        });
        // ['002', '002-101', '002-101-301','002-101-302']
        console.log(list);
        // 如果一个父节点下选中多个子节点,删除子节点并重新赋值。
        if(list.length !== 1){ 
         // 由于当前为选中操作,所以需要先删除当前节点下所有选中的子节点。
          list.forEach(item => {
            let index = checkedKeys.indexOf(item);
            checkedKeys.splice(index, 1);
          });
          // 此时处理完后,checkedKeys:[]
          // 添加本地选中的数据
          // ['002-101-302']
          checkedKeys.push(data.value)
        }
        // 结果 ['002-101-302']
        console.log(checkedKeys);
        // 重复赋值
        this.$refs.tree.setCheckedKeys(checkedKeys);
      }
    },

情况三: 点击取消

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 处理选择数据
    changeTree(data, list){
      console.log(data);   // {value: '002-101-302', label: '硬座'}
      console.log(list);   // {checkedKeys: []}
      // 1、判断是选中/取消选中操作 checked: -1表示取消选中,否则为选中
      let checkedKeys = list.checkedKeys;
      console.log(checkedKeys)  // []
      let checked = checkedKeys.indexOf(data.value);  // data.value  : 002-101-301
      console.log(checked);  // -1    ps: 返回-1时,表示数组不存在某个元素,此时直接结束方法
      // 2、选中则判断
      if(checked !== -1){
        let prefix = data.value.substring(0, 8);  // '002-101-' 截取父节点的ID
        let list = checkedKeys.filter( item => {
          // 根据父节点的ID判断,这个节点下有多少个子节点; item.length < 8: 删除所有的父节点
          return item.indexOf(prefix) !== -1 || item.length < 8;
        });
        console.log(list); // ['002-101-301']
        // 如果一个父节点下选中多个子节点,删除子节点并重新赋值。
        if(list.length !== 1){ // 
          list.forEach(item => {
            let index = checkedKeys.indexOf(item);
            checkedKeys.splice(index, 1);
          });
          checkedKeys.push(data.value)
        }
        // 结果
        console.log(checkedKeys);
        // 重复赋值
        this.$refs.tree.setCheckedKeys(checkedKeys);
      }
    },

情况四: 分别选中上半年和下半年各选一个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 处理选择数据
// 打印结果在上图,可以对照着看。
    changeTree(data, list){
      console.log(data);
      console.log(list);
      // 1、判断是选中/取消选中操作 checked: -1表示取消选中,否则为选中
      let checkedKeys = list.checkedKeys;
      console.log(checkedKeys)  // []
      let checked = checkedKeys.indexOf(data.value);
      console.log(checked);  // -1    ps: 返回-1时,表示数组不存在某个元素,此时直接结束方法
      // 2、选中则判断
      if(checked !== -1){
        let prefix = data.value.substring(0, 8);
        let list = checkedKeys.filter( item => {
          // 根据父节点的ID判断,这个节点下有多少个子节点; item.length < 8: 删除所有的父节点
          return item.indexOf(prefix) !== -1 || item.length < 8;
        });
        console.log(list); 
        // 如果一个父节点下选中多个子节点,删除子节点并重新赋值。
        if(list.length !== 1){ // 
          list.forEach(item => {
            let index = checkedKeys.indexOf(item);
            checkedKeys.splice(index, 1);
          });
          checkedKeys.push(data.value)
        }
        // 结果
        console.log(checkedKeys);
        // 重复赋值
        this.$refs.tree.setCheckedKeys(checkedKeys);
      }
    },

至此简单的多叶子节点实现单元就完成了。

完整源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div class="home">
    <el-row :gutter="60" style="background-color: wheat">
        <el-col :span="8"></el-col>
        <el-col :span="8">
          <div style="margin: 30px;">
            <el-tree
                :data="data"
                show-checkbox
                default-expand-all
                node-key="value"
                ref="tree"
                empty-text="no data"
                :check-on-click-node="true"
                highlight-current
                @check="changeTree"
                :props="defaultProps">
            </el-tree>

            <div class="buttons" style="margin-top: 30px;">
              <el-button @click="getCheckedNodes">通过 node 获取</el-button>
              <el-button @click="getCheckedKeys">通过 key 获取</el-button>
              <el-button @click="setCheckedNodes">通过 node 设置</el-button>
              <br>
              <el-button @click="setCheckedKeys">通过 key 设置</el-button>
              <el-button @click="resetChecked">清空</el-button>
            </div>
          </div>
        </el-col>
      </el-row>
  </div>
</template>
<script>
export default {
  name: "home",
  data() {
    return {
      data: [{
        value: '001',
        label: '上半年度出行',
        selectable: 'false',
        children: [{
          value: '001-101',
          label: '火车',
          selectable: 'false',
          children: [{
            value: '001-101-301',
            label: '硬座'
          }, {
            value: '001-101-302',
            label: '软卧'
          }]
        }]
      },{
        value: '002',
        label: '下半年出行',
        selectable: 'false',
        children: [{
          value: '002-101',
          label: '火车',
          selectable: 'false',
          children: [{
            value: '002-101-301',
            label: '硬座'
          }, {
            value: '002-101-302',
            label: '软卧'
          }]
        }]
      }],
      // 设置每个节点的属性
      defaultProps: {
        children: 'children',
        label: 'label',
        id: 'value',
        disabled: 'selectable'
      }
    };
  },
  mounted() {

  },
  methods: {
    // 处理选择数据
    changeTree(data, list){
      // 1、判断是选中/取消选中操作 checked: -1表示取消选中,否则为选中
      let checkedKeys = list.checkedKeys;
      console.log(checkedKeys)
      let checked = checkedKeys.indexOf(data.id);
      // 2、选中则判断
      if(checked !== -1){
        let prefix = data.id.substring(0, 8);
        let list = checkedKeys.filter( item => {

          return item.indexOf(prefix) !== -1 || item.length < 8;
        });
        console.log(list);
        // 如果一个父节点下选中多个子节点,删除子节点并重新赋值。
        if(list.length !== 1){
          list.forEach(item => {
            let index = checkedKeys.indexOf(item);
            checkedKeys.splice(index, 1);
          });
          checkedKeys.push(data.id)
        }
        // 结果
        console.log(checkedKeys);
        this.$refs.tree.setCheckedKeys(checkedKeys);
      }

    },
    getCheckedNodes() {
      console.log(this.$refs.tree.getCheckedNodes());
      console.log(this.$refs.tree.getCheckedNodes()[0].id);
      console.log(this.$refs.tree.getCheckedNodes()[0].label);
    },
    getCheckedKeys() {
      console.log(this.$refs.tree.getCheckedKeys());
    },
    setCheckedNodes() {
      this.$refs.tree.setCheckedNodes([{
        id: 5,
        label: '二级 2-1'
      }, {
        id: 9,
        label: '三级 1-1-1'
      }]);
    },
    setCheckedKeys() {
      this.$refs.tree.setCheckedKeys([3]);
    },
    resetChecked() {
      this.$refs.tree.setCheckedKeys([]);
    }
  },
}
</script>

<style scoped>

</style>

希望能您有所帮助!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
element的select和tree树形组件组合
<body> <div id="app"> <el-select v-model="mineStatus" placeholder="请选择" multiple @change="selectChange"> <el-option :value="mineStatusValue" style="height: auto">//option展开高度太小,把height设置为auto就好啦 <el-tree :data="data" show-checkbox node-
用户1349575
2022/02/22
1.6K0
vue 根据Cascader 级联选择器请求接口返回数据遍历Tree 树形控件并可以修改
html <el-form ref="form" :model="role" label-width="80px"> <el-form-item label="角色分类"> <el-cascader @change="rolechange" expand-trigger="hover" :props="casrule" :options="options" v-model="role.roleId"> </el-cascader> </el-f
lyudev
2022/08/04
1.2K0
解决 Vue3 + Element Plus 树形表格全选多选以及子节点勾选的问题
最近用到了 Element Plus 组件库的中的树形表格,但官网例子只能做到一层勾选,不能做到多层勾选,无法满足业务需求,所以研究了下,如何在子节点选满的情况下自动勾选上父节点? 勾选父节点时自动勾上全部子节点?
唐志远
2023/10/25
1.1K0
解决 Vue3 + Element Plus 树形表格全选多选以及子节点勾选的问题
element-plus tree组件使用
粒子,修改自cascader: <html> <head> <!-- Import style --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/element-plus/dist/index.css" /> <!-- Import Vue 3 --> <script src="https://cdn.jsdelivr.net/npm/vue@next"></script> <!--
周星星9527
2021/09/29
2.2K0
解决Vue 3 + Element Plus树形表格全选多选以及子节点勾选的问题
在Web应用程序中,树形表格是一种常见的数据展示方式,它使用户能够查看层次结构数据。而在使用Vue 3和Element Plus构建树形表格时,处理全选和多选以及子节点勾选的问题可能会有些挑战。本文将介绍如何解决Vue 3和Element Plus树形表格中的这些常见问题,并提供示例代码以便于理解。
IT_陈寒
2023/12/13
1.7K0
解决Vue 3 + Element Plus树形表格全选多选以及子节点勾选的问题
material Tree组件父节点联动改造
得到的一组数据之后,(不在之前的逻辑上直接设置关联的父节点,因为子节点是从上往下递归,而父节点需要至下而上的寻找)
biaoblog.cn 个人博客
2022/12/14
8630
material Tree组件父节点联动改造
【第三篇】商城系统-基础业务-实现类别管理
JDK8特性:https://blog.csdn.net/qq_38526573/category_11113126.html
用户4919348
2022/09/16
1K0
【第三篇】商城系统-基础业务-实现类别管理
Elementui Tree 树形控件删除子节点
要求: Elementui Tree 树形控件,将勾选选中的值放在list集合里面提交
王小婷
2021/11/24
2K0
Elementui Tree 树形控件删除子节点
关于vue中$nextTick的一点使用心得
当下公司在做一个媒体门户网站,后台由另一家公司使用java开发并提供接口,本人负责开发后台页面,使用的是vue-element-admin开发 下面说一下问题场景,在开发过程中有一个后台管理员角色页面,其中包含一个表单dialog,在其中使用了el-tree组件,相关 代码结构如下: <div class="filter-container"> <el-button class="filter-item" style="margin-left: 10px;" v-waves @click="hand
lestat
2018/04/17
2.3K0
深入解读 iView,解耦令人头疼的高度耦合复杂逻辑
有时候我们不知道如何去写更好的脚本,如何做功能组件之间的解耦,如何去学习更好的、更优质架构的代码,如何进行组件的提取,当我们到抓耳挠腮、苦思冥想的时候,回过头来看看我们常用的经典的框架的实现过程。
问问计算机
2021/05/08
2.3K0
深入解读 iView,解耦令人头疼的高度耦合复杂逻辑
手把手教你实现一个Vue无限级联树形表格(增删改)
平时我们可能在做项目时,会遇到一个业务逻辑。实现一个无限级联树形表格,什么叫做无限级联树形表格呢?就是下图所展示的内容,有一个祖元素,然后下面可能有很多子孙元素,你可以实现添加、编辑、删除这样几个功能。
Vam的金豆之路
2021/12/01
6030
手把手教你实现一个Vue无限级联树形表格(增删改)
我用Vue.js与ElementUI搭建了一个无限级联层级表格组件
今天,回老家了。第一件事就是回家把大屏安排上,写作的感觉太爽了,终于可以专心地写文章了。我们今天要做的项目是怎么样搭建一个无限级联层级表格组件,好了,多了不多说,赶快行动起来吧!
Vam的金豆之路
2021/12/01
7100
我用Vue.js与ElementUI搭建了一个无限级联层级表格组件
vue+element|el-tree树设置懒加载和设置默认勾选
在实际开发中,很多数据过于庞大,需要分批请求,使用到懒加载。但是在tree的方法中,使用懒加载后无法直接使用default-checked-keys默认勾选。想要这个效果该如何实现?
肥晨
2025/03/06
4280
Elementui Tree 树形控件,将勾选选中的值放在list集合里面提交
要求: Elementui Tree 树形控件,将勾选选中的值放在list集合里面提交
王小婷
2021/11/24
1.3K0
Elementui Tree 树形控件,将勾选选中的值放在list集合里面提交
猿实战12——类目属性之动态绑定
猿实战是一个原创系列文章,通过实战的方式,采用前后端分离的技术结合SpringMVC Spring Mybatis,手把手教你撸一个完整的电商系统,跟着教程走下来,变身猿人找到工作不是问题。更多精彩内容,敬请大家关注公主号猿人工厂,点击猿人养成获取!
山旮旯的胖子
2020/09/14
7040
Element-UI快速入门
https://element.eleme.cn/#/zh-CN/component/installation
陶然同学
2023/02/24
4.4K0
Element-UI快速入门
Spring Cloud Alibaba商城实战项目基础篇(day03)
我们需要维护所有菜单以及各种子菜单,子菜单里面可能还有子菜单,所以我们采用递归的方式进行书写。
上分如喝水
2023/03/07
1.5K0
Spring Cloud Alibaba商城实战项目基础篇(day03)
elementUI Tree 树形控件单选实现
义了一个currentNodeKey来存储当前选中节点的 key。每次点击节点时,我们首先检查是否已经有一个节点被选中,如果是,则通过this.$refs.tree.setCurrentKey(null)取消选中它。然后,我们更新currentNodeKey为新选中的节点 key。
肥晨
2024/03/22
1.3K0
SSM 单体框架 - 前端开发:用户和权限模块
在查询条件中使用了 Element UI 中的日期选择器:https://element.eleme.cn/#/zh-CN/component/date-picker#mo-ren-xian-shi-ri-qi
RendaZhang
2020/10/09
1.8K0
SSM 单体框架 - 前端开发:用户和权限模块
table表格拖拽
el-table 的拖拽使用 Sortable.js 官方文档 :https://github.com/SortableJS/Sortable
leader755
2022/03/09
2.9K1
推荐阅读
相关推荐
element的select和tree树形组件组合
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档