elementUI tree树形控件 根据数据动态设置禁用,全选时不可选中禁用数据

需求

根据后端返回的数据禁用数据,将tree结构对应的数据设置为禁用状态,并且在点击全选后不可选中禁用数据。

效果

根据数据动态设置禁用

全选时不可选中禁用数据

代码

js 复制代码
<template>
	...
	<div class="list-box">
		<div class="left">
			<h3 class="list-title">
				<el-checkbox v-model="checkAll"
                             style="margin-right: 15px;"
                             @change="handleCheckAllChange"></el-checkbox>
                <span>全部员工</span>
              </h3>
              <div class="list-main">
                <el-input placeholder="输入关键字进行过滤"
                          size="small"
                          v-model="filterText"
                          style="margin-bottom: 10px;">
                </el-input>
                <el-tree class="filter-tree"
                         ref="leftTreeRef"
                         node-key="id"
                         show-checkbox
                         :data="deptUser"
                         :props="defaultProps"
                         default-expand-all
                         :filter-node-method="filterNode"
                         :default-checked-keys="ruleForm.users"
                         @check-change="handleCheckChange">
                </el-tree>
			</div>
		</div>
		...
	</div>
    ...
</template>

<script>
...
export default {
  import API from '@/api.js'
  ...
  data() {
    return {
      ...
      checkAll: false, // 是否全选
      filterText: '', // 关键字过滤
      deptUser: [], // 部门员工树
      selectAllData: [], // 可全选数据
      ...
      defaultProps: {
        children: 'children',
        label: 'label',
        disabled: 'disabled'
      }
    }
  },
  watch: {
    filterText(val) {
      this.$refs.leftTreeRef.filter(val)
    }
  },
  ...
  methods: {
    getDeptUser() { // 获取部门员工
      api.GetDeptUser().then(res => {
        if (res.code === 200) {
          this.deptUser = res.data
          if (res.data2.length > 0) {
            this.setDisabled(this.deptUser, res.data2)
            this.selectAllData = this.setNoDisAll(JSON.parse(JSON.stringify(this.deptUser))) // 设置可全选的数据(删除不可选的数据)
          }
          ...
        } else {
          this.$message.error('错误')
        }
      })
    },
    setDisabled(nodes, disabledArr) { // 设置禁用节点 参数1要处理的数据(树结构) 参数2要禁用的数据(数组)
      nodes.forEach(node => {
        if (disabledArr.includes(node.id)) {
          node.disabled = true
        }
        if (node.children && node.children.length > 0) {
          this.setDisabled(node.children, disabledArr)
        }
      })
    },
    setNoDisAll(nodes) { // 设置可全选的数据 (删除禁用数据)
      const arr = []
      for (let i = 0; i < nodes.length; i++) {
        const item = nodes[i]
        if (item.disabled) {
          nodes.splice(i--, 1)
        } else {
          if (item.children && item.children.length > 0) {
            item.children = this.setNoDisAll(item.children)
          }
          arr.push(item)
        }
      }
      return arr
    },
    filterNode(value, data) {
      if (!value) return true
      return data.label.indexOf(value) !== -1
    },
    handleCheckAllChange(val) { // 列表全选/全不选
      if (this.checkAll) { // 全选
        this.$refs.leftTreeRef.setCheckedNodes(this.selectAllData)
      } else { // 全不选
        this.$refs.leftTreeRef.setCheckedKeys([])
      }
    }
    ...
  }
}
</script>
相关推荐
wkj0012 小时前
vue中 js-cookie 用法
前端·javascript·vue.js
GoldKey6 小时前
gcc 源码阅读---语法树
linux·前端·windows
Xf3n1an7 小时前
html语法
前端·html
张拭心7 小时前
亚马逊 AI IDE Kiro “狙击”Cursor?实测心得
前端·ai编程
烛阴7 小时前
为什么你的Python项目总是混乱?层级包构建全解析
前端·python
@大迁世界8 小时前
React 及其生态新闻 — 2025年6月
前端·javascript·react.js·前端框架·ecmascript
红尘散仙9 小时前
Rust 终端 UI 开发新玩法:用 Ratatui Kit 轻松打造高颜值 CLI
前端·后端·rust
新酱爱学习9 小时前
前端海报生成的几种方式:从 Canvas 到 Skyline
前端·javascript·微信小程序
袁煦丞9 小时前
把纸堆变数据流!Paperless-ngx让文件管理像打游戏一样爽:cpolar内网穿透实验室第539个成功挑战
前端·程序员·远程工作
慧慧吖@9 小时前
关于两种网络攻击方式XSS和CSRF
前端·xss·csrf