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>
相关推荐
韩曙亮几秒前
【Web APIs】浏览器本地存储 ① ( window.sessionStorage 本地存储 | window.localStorage 本地存储 )
服务器·前端·javascript·本地存储·localstorage·sessionstorage·web apis
吃杠碰小鸡3 分钟前
前端Mac快速搭建开发环境
前端·macos
前端大波7 分钟前
使用webpack-bundle-analyzer 对 react 老项目进行打包优化
前端·react.js·webpack·性能优化
前端 贾公子14 分钟前
(catalog协议) == pnpm (5)
前端·javascript·react.js
JarvanMo18 分钟前
深度解析:如何彻底终结 Flutter 异步操作中的 BuildContext 崩溃?
前端
wxr061623 分钟前
部署Spring Boot项目+mysql并允许前端本地访问
前端·spring boot·mysql·持续部署
假装我不帅29 分钟前
jquery-validation使用
前端·javascript·jquery
怕浪猫34 分钟前
React从入门到出门第六章 事件代理机制与原生事件协同
前端·javascript·react.js
天府之绝38 分钟前
uniapp 中使用uview表单验证时,自定义扩展的表单,在改变时无法触发表单验证处理;
开发语言·前端·javascript·vue.js·uni-app
be or not to be39 分钟前
Html-CSS动画
前端·css·html