关于element-plus的el-tree 组件常用属性及api及控制可拖动层级,el-tree 自定义全选 单选数据 小笔记

本文详细介绍了如何配置El-Tree组件的拖拽功能,包括draggable属性的使用,allow-drop和allow-drag的判断逻辑,以及如何处理节点点击、默认展开和选中状态。还涉及了自定义全选和父子节点的选择控制。

一 、关于配置拖动el-tree 常用配置
 

draggable是否开启拖拽节点功
 :allow-drop

拖拽时判定目标节点能否成为拖动目标位置

allow-drag判断节点能否被拖拽 如果返回 false ,节点不能被拖动'prev'、'inner' 和 'next',分别表示放置在目标节点前、插入至目标节点和放置在目标节点后
highlight-current 能是否高亮当前选中节点,默认值是 false。

@node-click="handleNodeClick"

处理点击之后数据

:default-expanded-keys="[101]"

默认展开的节点的 key 的数组
default-checked-keys 如果配置复选框默认勾选的节点的 key 的数组
 <el-tree
          v-if="isOpenAllLoading"
          style="width: 100%"
          :allow-drop="allowDrop"
          :allow-drag="allowDrag"
          :data="BranchLists"
          draggable
          :default-expand-all="isOpenAllBranch"
          node-key="id"
          :default-expanded-keys="[]"
          :current-node-key="[]"
          @node-drag-over="handleDragOver"
          @node-drag-end="handleDragEnd"
          @node-drop="handleDrop"
          @node-click="handleNodeClick"
        >
          <template #default="{ node, data }">
            <span class="custom-tree-node">
              <span class="tree_label">{{ node.label }} </span>
              <span style="color: #0274f7" @click.stop>
                      
                <a type="text" @click.stop="createdBranch(node, data)" v-if="node.level != 4"
                  >新建</a
                >
                <a type="text" @click.stop="eidtBranchhandle(node, data)">编辑</a>
              </span>
            </span>
          </template>
        </el-tree>
// 处理激活数据

const handleNodeClick = (node) => {
  console.log('handleNodeClick showBrandId', node)
  search( node.id)
  // 刷新列表
  // getist( node.id)
}

1 需要控制最大层级 tree  当前到第几可拖动 :allow-drop="allowDrop"

allow-drop拖拽时判定目标节点能否成为拖动目标位置。 如果返回 false ,拖动节点不能被拖放到目标节点。 type 参数有三种情况:'prev'、'inner' 和 'next',分别表示放置在目标节点前、插入至目标节点和放置在目标节点后Function(draggingNode, dropNode, type)
// 禁止拖动到第四级
const allowDrop = (draggingNode: Node, dropNode: Node, type: AllowDropType) => {
  console.log('🚀 ~ allowDrop ~ dropNode:', dropNode, type)
  if (dropNode.level === 4) {
    return type !== 'inner'
  } else {
    return true
  }
}

2  @check-change="handleCheckbranch"  方法收集选择标识

const checkDeptIdList = ref([]) // 收集已选择ids 标识数组
//数据ids收集
const handleCheckbranch = (data: any, checked: boolean, isSelected: boolean) => {
  let idsList: Array<any> = checkDeptIdList
  if (checked) {
    idsList.push(data.id)
    // 选择父级子集id回收
    if (data.children && data.children.length) {
      const childIds = getAllIds(data.children)
      idsList.push(...childIds)
    }
  } else {
    idsList = (idsList || []).filter((item) => item !== data.id)
  }
 checkDeptIdList.value = [...new Set(idsList)] // 去重
}

3 拖动配置激活Ui 样式 自定义

   :deep(.el-tree) {
        .el-tree-node.is-current > .el-tree-node__content {
          background-color: #d9ecff;
          color: #409eff; // 节点的字体颜色
          font-weight: bold; // 字体加粗
        }
      }

4 el-tree 自定义全选 单选数据   子集不关联父级 通过check-strictly设置 

 <el-tree
                      ref="treeRef0"
                      style="max-width: 260px; min-height: 120px"
                      :data="branchTreeLsit"
                      show-checkbox
                      highlight-current
                      node-key="id"
                      :expand-on-click-node="false"
                      :check-on-click-node="false"
                      check-strictly
                      :default-checked-keys="roleIds"
                      :default-expanded-keys="From.specifiedDeptIdList"
                      @check-change="handleCheckbranchs"
                      :props="{
                        children: 'children',
                        label: 'name'
                      }"
                    />


const roleIds = ref([]) //目标ids arr
// 通过check-change 方法实现选择  父级可全选子集 子集不选择父级 全选配置分配树常用
// 指定部门全选 反向
const handleCheckbranchs = async (node, isSelect, isSelectChild) => {
  console.log(22222222, node, isSelect, isSelectChild)
  await getChildrenNodeKey(node, isSelect)
  treeRef0.value!.setCheckedKeys([...roleIds.value])  // 设置选中的树key
}


// 获取当前选中节点的子节点key 添加及删除
const getChildrenNodeKey = (node: any, type: boolean) => {
  if (type) {
   roleIds.value.push(node?.id)
  } else {
    const index = roleIds.value.indexOf(node.id)
    if (index != -1) {
      roleIds.value.splice(index, 1)
    }
  }
  roleIds.value = [0, ...new Set(roleIds.value)]
  if (node.children?.length > 0) {
    node.children.forEach((item: any) => {
      if (item.children?.length > 0) {
        getChildrenNodeKey(item, type, dataKey)
      } else {
        if (type) {
         roleIds.value.push(item?.id)
        } else {
          const i = roleIds.value.indexOf(item.id)
          if (i != -1) {
            roleIds.value.splice(i, 1)
          }
        }
      }
    })
  }
}


后面带补充

Element Plus 的 `el-tree` 组件提供了一个高度可定制的数据驱动树形控件,其中包含丰富的功能,包括全选、清空和反选操作。以下是关于这些功能的基本解释: 1. **全选** (All Select): 可以通过点击顶部节点的复选框,或者设置相应的事件处理器,实现树中所有子节点的选中状态同步更新。这通常需要配合 `check` 或 `check-strictly` 属性以及 `default-checked-keys` 或 `default-checked` 数据属性来配置。 2. **清空选择** (Clear Selection): 当用户希望清除当前的所有选中项时,可以触发 `clearSelection` 方法或者监听 `@selection-change` 事件,然后手动将 `checkedKeys` 或者全局的 `selectedKeys` 设置为空数组。 3. **反选** (Invert Selection): 如果希望所有非选中的项变成选中,而选中的项变为未选中,同样可以使用 `clearSelection` 然后添加所有其他非选中的节点到 `checkedKeys` 中,或者在事件处理器中对当前选中的键进行取反操作。 要实现上述操作,你需要在组件的实例上绑定这些方法,并根据实际需求调用它们。例如: ```html <template> <el-tree :data="treeData" @selection-change="handleSelectionChange"> <!-- ... --> </el-tree> </template> <script> export default { methods: { handleSelectionChange(selectedKeys) { // 全选、清空、反选处理 if (this.toggleAll) { selectedKeys.length ? this.clearSelection() : this.selectAll() } else { // 反选逻辑 const allKeys = this.treeData.map(item => item.key); selectedKeys.length && this.checkKey(notifyKeys(allKeys, selectedKeys)) } }, selectAll() { // 设置所有节点选中 this.$refs.tree.setCheckedKeys([...allKeys]) }, clearSelection() { this.$refs.tree.setCheckedKeys([]) }, checkKey(keys) { keys.forEach(key => this.$refs.tree.setChecked(key, true)) } } } </script> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值