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>
相关推荐
肥肠可耐的西西公主11 分钟前
前端(AJAX)学习笔记(CLASS 2):图书管理案例以及图片上传
前端·笔记·学习
大胖丫12 分钟前
vue 学习-vite api.js
开发语言·前端·javascript
孙桂月13 分钟前
ES6相关操作(2)
前端·javascript·es6
陈浩源同学14 分钟前
学习 TypeScript 栈和队列数据结构
前端·算法
我这一生如履薄冰~16 分钟前
简单封装一个websocket构造函数
前端·javascript·websocket
fangcaojushi16 分钟前
解决webpack5.54打包图片及图标的问题
前端·vue.js
海盗强16 分钟前
Webpack打包优化
前端·webpack·node.js
星之卡比*18 分钟前
前端面试题---vite和webpack的区别
前端·面试
^^为欢几何^^23 分钟前
npm、pnpm和yarn有什么区别
前端·npm·node.js
AC-PEACE1 小时前
Vue 中 MVVM、MVC 和 MVP 模式的区别
前端·vue.js·mvc