el-tree基础的树形节点设置节点不能选中高亮出来,对已经选中的节点设置disabled,对当前节点刚选中后设置禁用disabled

一、 el-tree基础的树形节点设置节点不能选中高亮出来

需求

我们使用element-ui或者element-plus的时候会遇到树形控件的使用,我们使用树形控件会限制有的节点不让选中和高亮出来,这个时候需要我们做限制。在实现中我们发现了element-ui和element-plus的时候他们实现的方式还是有点区别的,我们就简单来实现一下。

实现效果如下:

在这里插入图片描述

vue2+element-ui

发现element-ui中更改current-node-key值无效,最后用this.$refs.tree.setCurrentKey方法实现了
实现的思路:

  • el-tree加上highlight-current属性,高亮当前选中节点
  • ref="tree"绑定组件
  • el-tree的点击事件@node-click中判断是有子元素的节点,则找到上次高亮的节点,让它继续选中高亮,思路是通过node-key="id"和this.$refs.tree.setCurrentKey方法
  <el-tree
        :data="treeData"
        :props="defaultProps"
        @node-click="handleNodeClick"
        highlight-current
        ref="tree"
        node-key="id"
      >


 handleNodeClick(data, node) {
 //设置不能选中的节点
      if (data.disabled) {
        this.$nextTick(() => {
          this.$refs.tree.setCurrentKey(this.currentNodeKey);
        });
        return;
      }
      this.currentNodeKey = data.id;
    }

vue3+element-plus

发现element-plus中更改current-node-key值是有效的,通过这个属性实现
思路:

  • el-tree加上highlight-current属性,高亮当前选中节点
  • el-tree的点击事件@node-click中判断有子元素的节点不能选中高亮,核心代码node.isCurrent = false,让当前节点取消选中
  • 这时需要找到上次高亮的节点,让它继续选中高亮,思路是通过node-key与current-node-key属性
<template>
  <el-tree 
      :data="data" 
      :props="defaultProps" 
      @node-click="handleNodeClick" 
      highlight-current  
      node-key="id"  
      :current-node-key="currentNodeKey"
      default-expand-all
      :expand-on-click-node="false"/>
</template>

<script lang="ts" setup>
import type Node from 'element-plus/es/components/tree/src/model/node'
import { ref, nextTick } from "vue"
interface Tree {
  label: string
  children?: Tree[]
}

const currentNodeKey = ref("")
const treeId = ref("")
const handleNodeClick = (data: Tree, node: Node) => {
    // 有子元素的节点,不能选中
    if (data.children.length) {
        node.isCurrent = false
        // 值更改,触发watch
        currentNodeKey.value = ""
        // 还原之前的高亮节点
        nextTick(() => {
          currentNodeKey.value = treeId.value
        })
        return
    }
    treeId.value = data.id
    // 点击树节点执行的代码
    ...
}

const data: Tree[] = [
  {
    label: 'Level one 1',
    children: [
      {
        label: 'Level two 1-1',
        children: [
          {
            label: 'Level three 1-1-1',
          },
        ],
      },
    ],
  },
  {
    label: 'Level one 2',
    children: [
      {
        label: 'Level two 2-1',
        children: [
          {
            label: 'Level three 2-1-1',
          },
        ],
      },
      {
        label: 'Level two 2-2',
        children: [
          {
            label: 'Level three 2-2-1',
          },
        ],
      },
    ],
  },
  {
    label: 'Level one 3',
    children: [
      {
        label: 'Level two 3-1',
        children: [
          {
            label: 'Level three 3-1-1',
          },
        ],
      },
      {
        label: 'Level two 3-2',
        children: [
          {
            label: 'Level three 3-2-1',
          },
        ],
      },
    ],
  },
]

const defaultProps = {
  children: 'children',
  label: 'label',
}
</script>


二、 对已经选中的节点设置disabled

el-tree 动态渲染值对已知节点disabled

实现思路:

  • 从后台动态获取的树的数据
  • 项目需求要把其中的某一个节点设置为禁用
  • 在data中配置el-tree的props
  • 我这里是已知节点的数据 判断节点id来设置disabled
   <el-tree
      ref="tree"
      :data="menuData"
      show-checkbox
      node-key="node_id"
      :props="defaultProps2"
      :default-checked-keys="checkedId"
    />
defaultProps2: {
  children: 'children',
  label: 'name',
  disabled: function(data, node) {
    // 禁用回收站选项
    if (data.level === 3) {
      return true
    }
  }
}

三、对当前节点刚选中后设置禁用disabled(设置多复选框为不可编辑,只有选中后就不能编辑操作)

实现效果如下:

在这里插入图片描述
具体操作如下:

html

<template>
    <div class="tree3">
        <span>设置多选复选框为不可编辑,只要选中就不可编辑</span>
        <div style="margin-left: 600px;width:100%">
            <el-tree
                    :data="data3"
                    ref="tree"
                    show-checkbox
                    node-key="id"
                    :check-on-click-node="checkNodeFlag"
                    :default-expanded-keys="[2, 3]"

                    @check-change="handleCheckChageFun"
                    @check="handleCheckFun"
            >
            </el-tree>
        </div>

        <!--  :default-checked-keys="defaultCheckedKeys" -->
    </div>

</template>

js

data() {
    return {
        checkNodeFlag:false,
        currNodeId:'',//当前选中nodeId
        defaultCheckedKeys:[],
        data3: [{
            id: 1,
            label: '一级 2',
            disabled:false,
            children: [{
                id: 3,
                label: '二级 2-1',disabled:false
            }, {
                id: 2,
                label: '二级 2-2',
                disabled:false
            },
            {id: 4, label: '2级 4',disabled:false},
            {id: 5, label: '2级 5',disabled:false},
            {id: 6, label: '2级 6',disabled:false},
            {id: 7, label: '2级 7',disabled:false},
            {id: 8, label: '2级 8',disabled:false},
            {id: 9, label: '2级 9',disabled:false},
            {id: 10, label: '2级 10',disabled:false},
            {id: 11, label: '2级 11',disabled:false},
            {id: 12, label: '2级 12',disabled:false},
            {id: 13, label: '2级 13',disabled:false},
            {id: 14, label: '2级 14',disabled:false},
            {id: 15, label: '2级 15',disabled:false},
            {id: 16, label: '2级 16',disabled:false},
            {id: 17, label: '2级 17',disabled:false},
            {id: 18, label: '2级 18',disabled:false},

            ]
        }],
        disableData:this.data3,
        defaultProps: {
            children: 'children',
            label: 'label'
        }
    };
},
methods:{
    handleCheckChageFun(currNode){
         console.log("hanleCheckChageFun---");
     },
     handleCheckFun(currNode){
         this.currNodeId = currNode.id;
         this.defaultCheckedKeys= null
         this.dealTreeOnceChecked(this.data3)
     },
     dealTreeOnceChecked(arrMenus){
         arrMenus === undefined ?  arrMenus=[]:''
         if(arrMenus.length > 0){
             //let disarr = [];
             arrMenus.forEach(item => {
                 let arrChildren = item.children
                 if(arrChildren  !== null) this.dealTreeOnceChecked(arrChildren)
                 item.id === this.currNodeId ?  item.disabled = true :'';

             })
         }
     }
 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/352391.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于C语言的趣味游戏之五子棋

目录 趣味五子棋游戏 第一步 text.c文件 第二步 game.h文件 第三步 初始化 打印棋盘 玩家输入 电脑输入 判断输赢 game.c 趣味五子棋游戏 第一步 先写菜单&#xff0c;然后在主函数里调用&#xff0c;由于这是一个可以重复的游戏所以将do while循环里调用menu函数。…

《WebKit技术内幕》学习之十五(2):Web前端的未来

2 嵌入式应用模式 2.1 嵌入式模式 读者可能会奇怪本章重点表达的是Web应用和Web运行平台&#xff0c;为什么会介绍嵌入式模式&#xff08;Embedded Mode&#xff09;呢&#xff1f;这是因为很多Web运行平台是基于嵌入式模式的接口开发出来的&#xff0c;所以这里先解释一下什…

keepalived+nginx双主热备(有问题私信)

keepalivednginx双主热备 前言keepalivednginx双主热备keepalivednginx双主热备部署安装nginx安装keepalived修改master节点的keepalived配置文件 修改backup节点的keeepalived配置文件配置keepalived主备配置keepalived双主热备 前言 有关keepalived和nginx的一些工作原理&am…

uniapp封装公共的方法或者数据请求方法

仅供自己参考&#xff0c;不是每个页面都用到这个方法&#xff0c;所以我直接在用到的页面引用该公用方法&#xff1a; 1、新建一个util.js文件 export const address function(options){return new Promise((resolve,reject)>{uni.request({url:"https://x.cxniu.…

matlab对负数开立方根得到虚数的解决方案

问题描述&#xff1a;在matlab中&#xff0c;对负数开立方根&#xff0c;不出意外你将得到虚数。 例如 − 27 3 \sqrt[3]{-27} 3−27 ​&#xff0c;我们知道其实数解是-3&#xff0c;但在matlab中的计算结果如下&#xff1a; 问题原因&#xff1a;matlab中的立方根运算是在…

【JAVA面试精选篇-初生牛犊不怕虎】

文章目录 🌽 简介🧺 线程池🌄 Redis⏰ JVM🚛 数据结构🍎 Mysql🍡 结语🌽 简介 海阔凭鱼跃,天高任鸟飞! 学习不要盲目,让大脑舒服的方式吸收知识!!! 本人马上离开济南,回泰安发展,为了积极准备面试,目前在梳理一些知识点,同时希望能够帮助到需要的人… …

libjsoncpp 的编译和交叉编译

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【现代密码学基础】详解完美安全与香农定理

目录 一. 介绍 二. 完美安全的密钥与消息空间 三. 完美安全的密钥长度 四. 最优的完美安全方案 五. 香农定理 &#xff08;1&#xff09;理论分析 &#xff08;2&#xff09;严格的正向证明 &#xff08;3&#xff09;严格的反向证明 六. 小结 一. 介绍 一次一密方案…

【常用工具】7-Zip 解/压缩软件——基本使用方法

在实际日常工作或项目中&#xff0c;经常会遇到需要在window操作系统上压缩文件&#xff0c;在Linux操作系统上解压缩的场景&#xff0c;一款实用的压缩软件迫在眉睫&#xff0c;经过实际使用总结&#xff0c;7-Zip可以很好的解决很多压缩和解压缩问题&#xff0c;其基本使用方…

【音视频原理】音频编解码原理 ③ ( 音频 比特率 / 码率 | 音频 帧 / 帧长 | 音频 帧 采样排列方式 - 交错模式 和 非交错模式 )

文章目录 一、音频 比特率 / 码率1、音频 比特率2、音频 比特率 案例3、音频 码率4、音频 码率相关因素5、常见的 音频 码率6、视频码率 - 仅做参考 二、音频 帧 / 帧长1、音频帧2、音频 帧长度 三、音频 帧 采样排列方式 - 交错模式 和 非交错模式1、交错模式2、非交错模式 一…

精品基于Uniapp+springboot助农管理系统App农产品积分购物商城

《[含文档PPT源码等]精品基于Uniappspringboot助农管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm 安卓…

spring-boot redis stream消息队列demo-及死信简单处理

Redis stream 是 Redis 5 引入的一种新的数据结构&#xff0c;它是一个高性能、高可靠性的消息队列&#xff0c;主要用于异步消息处理和流式数据处理。在此之前&#xff0c;想要使用 Redis 实现消息队列&#xff0c;通常可以使用例如&#xff1a;列表&#xff0c;有序集合、发布…

Leetcode刷题笔记题解(C++):1114. 按序打印(多线程)

思路&#xff1a; 保证A,B,C三个线程的顺序不会变&#xff0c;即优先级顺序的问题 A,B需要资源1&#xff0c;B,C需要资源2 A先占用资源1和资源2&#xff0c;A线程完了之后释放资源1不释放资源2&#xff0c;然后B线程占用资源1&#xff0c;A线程完了之后释放资源1和资源2&…

28个炫酷的纯CSS特效动画示例(含源代码)

CSS是网页的三驾马车之一&#xff0c;是对页面布局的总管家&#xff0c;2024年了&#xff0c;这里列出28个超级炫酷的纯CSS动画示例&#xff0c;让您的网站更加炫目多彩。 文章目录 1. 涌动的弹簧效果2. 超逼真的3D篮球弹跳&#xff0c;含挤压弹起模态3. 鼠标放div上&#xff0…

Cesium加载地图-高德影像

废话不多说&#xff0c;直接上代码 整体代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><…

PyTorch 中的nn.Conv2d 类

nn.Conv2d 是 PyTorch 中的一个类&#xff0c;代表二维卷积层&#xff08;2D Convolution Layer&#xff09;。这个类广泛用于构建卷积神经网络&#xff08;CNN&#xff09;&#xff0c;特别是在处理图像数据时。 基本概念 卷积: 在神经网络的上下文中&#xff0c;卷积是一种特…

xshell无法连接linux,查询本机ip时出现<NO-CARRIER,BROADCAST,MULTICAST,UP>

在用xshell连接虚拟机VMware中的linux时&#xff0c;发现昨天还能连通的&#xff0c;今天连接不了了 我寻思应该是网卡配置出问题了&#xff0c;就去终端ip addr试了一下&#xff0c;果然发现问题&#xff0c;ip 查看网卡ens33就发现出现ens33:<NO-CARRIER,BROADCAST,MULTI…

自然语言处理:transfomer架构

介绍 transfomer是自然语言处理中的一个重要神经网络结构&#xff0c;算是在传统RNN和LSTM上的一个升级&#xff0c;接下来让我们来看看它有处理语言序列上有哪些特殊之处 模型整体架构 原论文中模型的整体架构如下&#xff0c;接下来我们将层层解析各层的作用和代码实现 该…

java中aes加密解密工具类

java中aes加密解密工具类 字符串&#xff1a;{“DATA”:{“SJH”:“17600024168”,“DLZH”:“91510104MA67FPXR5T”,“DLMM”:“jhdz123456”,“DLSF”:“5”,“NSRSBH”:“91510104MA67FPXR5T”},“JRSF”:“23”} 加密后&#xff1a;y4mzmi3jta22aXeIPfEdzu8sgA9uy3OevaIY…

LSTM的多变量时间序列预测(北京PM2.5预测)

参考博客 文章目录 LSTM简介数据集简介数据预处理多元LSTM预测模型数据准备&#xff1a;定义和拟合模型评估模型 训练多个滞后时间步 LSTM简介 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊类型的循环神经网络&#xff08;RNN&#xff09;&#xff0c;它在处…