CheckBox 四级联动

1,308 阅读4分钟

CheckBox 四级联动

权限系统经常会遇到的需求,实现 CheckBox 多级联动的效果。项目是基于 vue + element-ui. 效果图如下:

数据

数据的话,需要前后端约定好一个规则,详细代码如下:

HTML部分:

<div class="table-common-container">
  <el-checkbox v-model="selcetAll" :indeterminate="indeterminateAll" @change="checkedAll($event)">全选</el-checkbox>
  <table class="table" cellspacing="0" cellpadding="0" border="0">
    <thead>
      <tr>
        <th>系统板块</th>
        <th>功能页面</th>
        <th>按钮权限</th>
      </tr>
    </thead>
    <tbody ref="tbody_t">
      <template v-for="(tr, k) in tableList.items">
        <tr v-for="(item, i) in tr.children" :key="i + '_' + k">
          <td v-if="i === 0" :rowspan="tr.children.length">
            <el-checkbox v-model="tr.has" :indeterminate="tr.indeterminate" @change="parentChange($event, tr, tableList.items)" :label="tr.displayName"></el-checkbox>
          </td>
          <td :key="i + '_' + i">
            <el-checkbox v-model="item.has" :indeterminate="item.indeterminate" :label="item.displayName" @change="childChange($event, tr, item, tableList.items)"></el-checkbox>
          </td>
          <td>
            <el-checkbox v-model="td.has" v-for="(td, s) in item.children" :label="td.displayName" :key="s + '_' + i"
              @change="grandsonChange((checkbox = $event), tr, item, td, tableList.items, s)"></el-checkbox>
          </td>
        </tr>
      </template>
    </tbody>
  </table>
    </div>

javascript 部分:

export default {
  data () {
    return {
      selcetAll: false,
      indeterminateAll: false,
      selectRolePermisssion: [],
      tableList: {
        items: [
          {
            name: 'SystemSettings',
            displayName: '开发系统',
            has: false,
            children: [
              {
                name: 'SystemSettings.ProductCategory',
                displayName: '权限一',
                has: false,
                children: [
                  {
                    name: 'SystemSettings.ProductCategory.GetList',
                    displayName: '查看',
                    has: false
                  },
                  {
                    name: 'SystemSettings.ProductCategory.Create',
                    displayName: '新增',
                    has: false
                  },
                  {
                    name: 'SystemSettings.ProductCategory.CreateChildren',
                    displayName: '新增子分类',
                    has: false
                  },
                  {
                    name: 'SystemSettings.ProductCategory.Delete',
                    displayName: '删除',
                    has: false
                  },
                  {
                    name: 'SystemSettings.ProductCategory.Edit',
                    displayName: '修改',
                    has: false
                  }
                ]
              },
              {
                name: 'SystemSettings.Staff',
                displayName: '权限二',
                has: false,
                children: [
                  {
                    name: 'SystemSettings.Staff.GetList',
                    displayName: '查看',
                    has: false,
                    children: []
                  },
                  {
                    name: 'SystemSettings.Staff.Create',
                    displayName: '新增',
                    has: false,
                    children: []
                  },
                  {
                    name: 'SystemSettings.Staff.Edit',
                    displayName: '修改',
                    has: false,
                    children: []
                  },
                  {
                    name: 'SystemSettings.Staff.ToggleActive',
                    displayName: '启用/禁用',
                    has: false,
                    children: []
                  },
                  {
                    name: 'SystemSettings.Staff.ResetPwd',
                    displayName: '重置密码',
                    has: false,
                    children: []
                  }
                ]
              },
              {
                name: 'SystemSettings.RolePermission',
                displayName: '权限三',
                has: false,
                children: [
                  {
                    name: 'SystemSettings.RolePermission.GetList',
                    displayName: '查看列表',
                    has: false,
                    children: []
                  },
                  {
                    name: 'SystemSettings.RolePermission.Create',
                    displayName: '新增',
                    has: false,
                    children: []
                  },
                  {
                    name: 'SystemSettings.RolePermission.Edit',
                    displayName: '修改',
                    has: false,
                    children: []
                  },
                  {
                    name: 'SystemSettings.RolePermission.Delete',
                    displayName: '删除',
                    has: false,
                    children: []
                  }
                ]
              },
              {
                name: 'SystemSettings.CustomerLevel',
                displayName: '权限四',
                has: false,
                children: [
                  {
                    name: 'SystemSettings.CustomerLevel.GetList',
                    displayName: '查看列表',
                    has: false,
                    children: []
                  },
                  {
                    name: 'SystemSettings.CustomerLevel.Create',
                    displayName: '新增',
                    has: false,
                    children: []
                  },
                  {
                    name: 'SystemSettings.CustomerLevel.Edit',
                    displayName: '修改',
                    has: false,
                    children: []
                  },
                  {
                    name: 'SystemSettings.CustomerLevel.Delete',
                    displayName: '删除',
                    has: false,
                    children: []
                  }
                ]
              }
            ]
          },
          {
            name: 'test',
            displayName: '营建系统',
            has: false,
            children: [
              {
                name: 'test.ProductCategory',
                displayName: '权限一',
                has: false,
                children: [
                  {
                    name: 'test.ProductCategory.GetList',
                    displayName: '查看',
                    has: false,
                    children: []
                  },
                  {
                    name: 'test.ProductCategory.Create',
                    displayName: '新增',
                    has: false,
                    children: []
                  },
                  {
                    name: 'test.ProductCategory.CreateChildren',
                    displayName: '新增子分类',
                    has: false,
                    children: []
                  },
                  {
                    name: 'test.ProductCategory.Delete',
                    displayName: '删除',
                    has: false,
                    children: []
                  },
                  {
                    name: 'test.ProductCategory.Edit',
                    displayName: '修改',
                    has: false,
                    children: []
                  }
                ]
              },
              {
                name: 'test.Staff',
                displayName: '权限二',
                has: false,
                children: [
                  {
                    name: 'test.Staff.GetList',
                    displayName: '查看',
                    has: false,
                    children: []
                  },
                  {
                    name: 'test.Staff.Create',
                    displayName: '新增',
                    has: false,
                    children: []
                  },
                  {
                    name: 'test.Staff.Edit',
                    displayName: '修改',
                    has: false,
                    children: []
                  },
                  {
                    name: 'test.Staff.ToggleActive',
                    displayName: '启用/禁用',
                    has: false,
                    children: []
                  },
                  {
                    name: 'test.Staff.ResetPwd',
                    displayName: '重置密码',
                    has: false,
                    children: []
                  }
                ]
              },
              {
                name: 'test.RolePermission',
                displayName: '权限三',
                has: false,
                children: [
                  {
                    name: 'test.RolePermission.GetList',
                    displayName: '查看列表',
                    has: false,
                    children: []
                  },
                  {
                    name: 'test.RolePermission.Create',
                    displayName: '新增',
                    has: false,
                    children: []
                  },
                  {
                    name: 'test.RolePermission.Edit',
                    displayName: '修改',
                    has: false,
                    children: []
                  },
                  {
                    name: 'test.RolePermission.Delete',
                    displayName: '删除',
                    has: false,
                    children: []
                  }
                ]
              },
              {
                name: 'test.CustomerLevel',
                displayName: '权限四',
                has: false,
                children: [
                  {
                    name: 'test.CustomerLevel.GetList',
                    displayName: '查看列表',
                    has: false,
                    children: []
                  },
                  {
                    name: 'test.CustomerLevel.Create',
                    displayName: '新增',
                    has: false,
                    children: []
                  },
                  {
                    name: 'test.CustomerLevel.Edit',
                    displayName: '修改',
                    has: false,
                    children: []
                  },
                  {
                    name: 'test.CustomerLevel.Delete',
                    displayName: '删除',
                    has: false,
                    children: []
                  }
                ]
              }
            ]
          }
        ]
      }
    }
  },
  created () {
    // 从后端拿到提交的数据后,对其进行处理,渲染已选中的。

    // let data = ['SystemSettings.ProductCategory.GetList', 'SystemSettings.RolePermission.GetList', 'test.ProductCategory.CreateChildren',
    //   'test.Staff.Create', 'test.Staff.Edit', 'SystemSettings.ProductCategory.Create', 'SystemSettings.ProductCategory.CreateChildren', 'test.CustomerLevel.GetList']
    // this.tableList.items.forEach(item => {
    //   item.children.forEach(first => {
    //     first.children.forEach(second => {
    //       if (data.includes(second.name)) {
    //         second.has = true
    //       } else {
    //         second.has = false
    //       }
    //     })
    //   })
    // })
    // this.init(this.tableList.items)
  },
  methods: {
    testSubmit () {
      console.log(this.selectRolePermisssion)
    },
    // 初始化
    init (data) {
      data.forEach((par) => {
        if (par.has) {
          this.selectRolePermisssion.push(par.name)
          par.indeterminate = false
          par.children.forEach((child) => {
            this.selectRolePermisssion.push(child.name)
            child.children.forEach((gson) => {
              this.selectRolePermisssion.push(gson.name)
            })
          })
        } else {
          this.selcetAll = true
          this.indeterminateAll = true
          par.children.forEach((child) => {
            if (child.has) {
              this.selectRolePermisssion.push(child.name)
              par.has = true
              par.indeterminate = true
              child.children.forEach((gson) => {
                this.selectRolePermisssion.push(gson.name)
              })
            } else {
              child.children.forEach((gson) => {
                if (gson.has) {
                  this.selectRolePermisssion.push(gson.name)
                  child.has = true
                  child.indeterminate = true
                  par.has = true
                  par.indeterminate = true
                }
              })
            }
          })
        }
      })
      if (
        data.filter((val) => {
          return val.indeterminate === true
        }).length === 0 &&
      data.filter((val) => {
        return val.has === true
      }).length === 0
      ) {
        this.selcetAll = false
        this.indeterminateAll = false
      } else if (data.filter((val) => {
        return val.has === true
      }).length === data.length) {
        this.selcetAll = true
        this.indeterminateAll = false
      }
    },
    // 总节点
    parentChange (event, tr, all) {
      if (event) {
        tr.has = true
        tr.indeterminate = false
        this.selectRolePermisssion.push(tr.name)
        tr.children.forEach((ele) => {
          this.selectRolePermisssion.push(ele.name)
          ele.has = true
          ele.indeterminate = false
          ele.children.forEach((child) => {
            this.selectRolePermisssion.push(child.name)
            child.has = true
          })
        })
        if (
          all.filter((val) => {
            if (val.indeterminate) {
              return val.indeterminate === true
            }
          }).length === 0 &&
        all.filter((val) => {
          return val.has === true
        }).length === all.length
        ) {
          this.selcetAll = true
          this.indeterminateAll = false
        } else {
          this.selcetAll = true
          this.indeterminateAll = true
        }
      } else {
        tr.has = false
        tr.indeterminate = false
        this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
          return val !== tr.name
        })
        tr.children.forEach((ele) => {
          ele.has = false
          ele.indeterminate = false
          this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
            return val !== ele.name
          })
          ele.children.forEach((child) => {
            child.has = false
            this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
              return val !== child.name
            })
          })
        })
        if (
          all.filter((val) => {
            if (val.indeterminate) {
              return val.indeterminate === false
            }
          }).length === 0 &&
        all.filter((val) => {
          return val.has === true
        }).length === 0
        ) {
          this.selcetAll = false
          this.indeterminateAll = false
        } else {
          this.selcetAll = true
          this.indeterminateAll = true
        }
      }
    },
    // 父节点change
    childChange (event, tr, item, all) {
      if (event) {
        item.has = true
        this.selectRolePermisssion.push(item.name)
        item.children.forEach((ele) => {
          this.selectRolePermisssion.push(ele.name)
          ele.has = true
        })

        if (
          tr.children.filter((val) => {
            return val.has === false
          }).length <= 0
        ) {
          tr.has = true
          tr.indeterminate = false
          this.selectRolePermisssion.push(tr.name)
        } else {
          if (
            tr.children.filter((val) => {
              return val.has === false
            }).length === tr.children.length
          ) {
            tr.indeterminate = false
            tr.has = false
          } else {
            tr.has = true
            tr.indeterminate = true
            this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
              return val !== tr.name
            })
          }
        }
        if (
          all.filter((val) => {
            if (val.indeterminate) {
              return val.indeterminate === true
            }
          }).length === 0 &&
        all.filter((val) => {
          return val.has === true
        }).length === all.length
        ) {
          this.selcetAll = true
          this.indeterminateAll = false
        } else {
          this.selcetAll = true
          this.indeterminateAll = true
        }
      } else {
        this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
          return val !== item.name
        })
        item.children.forEach((ele) => {
          this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
            return val !== ele.name
          })
          ele.has = false
        })
        if (
          tr.children.filter((val) => {
            return val.has === false
          }).length <= 0
        ) {
          tr.has = true
          tr.indeterminate = false
          this.selectRolePermisssion.push(tr.name)
        } else {
          tr.has = true
          tr.indeterminate = true
          this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
            return val !== tr.name
          })
          if (
            tr.children.filter((val) => {
              return val.has === false
            }).length === tr.children.length
          ) {
            tr.has = false
            tr.indeterminate = false
            item.indeterminate = false
          } else {
            tr.has = true
            tr.indeterminate = true
            item.indeterminate = false
          }
        }
        if (
          all.filter((val) => {
            if (val.indeterminate) {
              return val.indeterminate === false
            }
          }).length === 0 &&
        all.filter((val) => {
          return val.has === true
        }).length === 0
        ) {
          this.selcetAll = false
          this.indeterminateAll = false
        } else {
          this.selcetAll = true
          this.indeterminateAll = true
        }
      }
    },
    // 孙子节点change  (checkbox = $event), tr, item, td, tableList.items, s)
    grandsonChange (event, tr, item, current, all, idx) {
      if (event) {
        current.has = true
        item.has = true
        tr.has = true
        item.indeterminate = true
        tr.indeterminate = true
        this.selectRolePermisssion.push(current.name)
        if (
          item.children.filter((val) => {
            return val.has === false
          }).length <= 0
        ) {
          item.has = true
          item.indeterminate = false
          this.selectRolePermisssion.push(item.name)
          if (
            tr.children.filter((val) => {
              return val.has === true
            }).length === tr.children.length &&
          tr.children.filter((val) => {
            return val.indeterminate === false
          }).length === tr.children.length
          ) {
            tr.has = true
            tr.indeterminate = false
            this.selectRolePermisssion.push(tr.name)
          } else {
            tr.has = true
            tr.indeterminate = true
            this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
              return val !== tr.name
            })
          }
        } else {
          item.has = true
          item.indeterminate = true
          this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
            return val !== item.name
          })
        }
        if (
          all.filter((val) => {
            if (val.indeterminate) {
              return val.indeterminate === true
            }
          }).length === 0 &&
        all.filter((val) => {
          return val.has === true
        }).length === all.length
        ) {
          this.selcetAll = true
          this.indeterminateAll = false
        } else {
          this.selcetAll = true
          this.indeterminateAll = true
        }
      } else {
        current.has = false
        this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
          return val !== current.name
        })
        if (
          item.children.filter((val) => {
            return val.has === true
          }).length <= 0
        ) {
          item.has = false
          item.indeterminate = false
          this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
            return val !== item.name
          })
          if (
            tr.children.filter((val) => {
              return val.has === true
            }).length <= 0
          ) {
            tr.has = false
            tr.indeterminate = false
            this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
              return val !== tr.name
            })
          } else {
            tr.has = true
            tr.indeterminate = true
            this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
              return val !== tr.name
            })
          }
        } else {
          tr.has = true
          item.has = true
          tr.indeterminate = true
          item.indeterminate = true
          this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
            return val !== item.name
          })
          this.selectRolePermisssion = this.selectRolePermisssion.filter(function (val) {
            return val !== tr.name
          })
        }
        if (
          all.filter((val) => {
            if (val.indeterminate) {
              return val.indeterminate === false
            }
          }).length === 0 &&
        all.filter((val) => {
          return val.has === true
        }).length === 0
        ) {
          this.selcetAll = false
          this.indeterminateAll = false
        } else {
          this.selcetAll = true
          this.indeterminateAll = true
        }
      }
    },
    // 全选、取消功能
    checkedAll (event) {
      if (event) {
        this.indeterminateAll = false
        this.tableList.items.forEach((ele) => {
          ele.has = true
          ele.indeterminate = false
          this.selectRolePermisssion.push(ele.name)
          ele.children.forEach((child) => {
            child.has = true
            child.indeterminate = false
            this.selectRolePermisssion.push(child.name)
            if (child.children) {
              child.children.forEach((gson) => {
                gson.has = true
                gson.indeterminate = false
                this.selectRolePermisssion.push(gson.name)
              })
            }
          })
        })
      } else {
        this.indeterminateAll = false
        this.selectRolePermisssion = []
        this.tableList.items.forEach((ele) => {
          ele.has = false
          ele.indeterminate = false
          ele.children.forEach((child) => {
            child.has = false
            child.indeterminate = false
            if (child.children) {
              child.children.forEach((gson) => {
                gson.has = false
              })
            }
          })
        })
      }
    }
  }
}