vue3:树的默认勾选和全选、取消全选

文章介绍了如何在Vue应用中使用ElementPlus的el-select和el-tree组件实现选择框控制树形节点的全选和取消功能,包括处理全选状态切换、默认选中状态管理和DOM更新策略。
摘要由CSDN通过智能技术生成

实现的功能,上面有个选择框,当选中全部时,下方树被全选

代码:
<template>
  <div>
    <el-select v-model="selectAll" style="margin-bottom: 10px;" @change="handleSelectAllChange">
      <el-option value="all" label="全部">全部</el-option>
      <el-option value="one" label="取消">取消</el-option>
    </el-select>
    <el-tree ref="treeRef" class="filter-tree" :data="treeData" :props="defaultProps" node-key=id highlight-current
      :current-node-key="leafNode.id" @node-click="treeNodeClick" default-expand-all show-checkbox @check="check"
      :default-checked-keys="checKay" />
    <!-- 
    设置 check-strictly="true" 表明你希望节点之间的选择状态是独立的,用户可以单独选择每个节点而不影响其他节点的选中状态。这与全选或取消其下一级层级的功能是相符合的,因为这意味着用户可以选择父节点而不会影响其子节点的选中状态。
   -->
  </div>

</template>

<script setup>
import { ref } from "@vue/reactivity";
import { nextTick, watch } from "@vue/runtime-core";
import { ElTree } from "element-plus";
const { proxy } = getCurrentInstance();
const emit = defineEmits(["treeNodeClick"]);


const treeData = ref([{
  children: [{ 
   id: "1", label: "朝阳区", nodeType: 2 }],
  id: "2", label: "北京市", nodeType: 1
},
{
  children: [{
    children: [{ id: "3", label: "高新区", nodeType: 3 },{ id: "5", label: "历下区", nodeType: 3 }],
    id: "4", label: "济南市", nodeType: 2
  }],
  id: "6", label: "山东省", nodeType: 1
},
{
  children: [{
    children: [{ id: "7", label: "长安区", nodeType: 3 }],
    id: "8", label: "石家庄", nodeType: 2
  }],
  id: "9", label: "河北省", nodeType: 1
},
{
  children: [{
    children: [{ id: "10", label: "中原区", nodeType: 3 }],
    id: "11", label: "郑州", nodeType: 2
  },{
    children: [{ id: "12", label: "老城区", nodeType: 3 }],
    id: "13", label: "洛阳", nodeType: 2
  }],
  id: "14", label: "河南省", nodeType: 1
},
])

const treeRef = ref(null);
const selectAll = ref(""); // 使用字符串类型的变量表示选择全部的状态
const defaultProps = {
  children: 'children',
  label: 'label',
};
const checKay = ref([])


const leafNode = ref({});
const check = (node, checked) => {
  if (checked) {
    // 选中节点
    console.log(node, checked);
    leafNode.value = node;
  } else {
    // 取消选中节点
    if (node.id === leafNode.value.id) {
      leafNode.value = {};
    }
  }
};
const treeNodeClick = (node) => {
  emit("treeNodeClick", node);
};
const handleSelectAllChange = (value) => {
  if (value == "all") {
    checKay.value = getAllIds(treeData.value)

  } else {
    // 如果取消选择全部,则遍历树节点并取消选中所有节点
    checKay.value = []
    nextTick(() => {
      treeRef.value.setCheckedKeys([]);
    });
  }
};
// 递归函数,获取所有节点的 id
const getAllIds = (nodes) => {
  let ids = [];
  nodes.forEach((node) => {
    ids.push(node.id);
    if (node.children) {
      ids = [...ids, ...getAllIds(node.children)];
    }
  });
  return ids;
};

// 递归函数,取消选中所有节点
const deselectAllNodes = (nodes) => {
  nodes.forEach((node) => {
    node.checkedKeys = [];
    if (node.children) {
      deselectAllNodes(node.children);
    }
  });
};
</script>
<style scoped>
.filter-tree {
  /* margin-top: 10px; */
}
</style>
实现效果:

具体代码剖析:
 A、html部分
 <el-tree ref="treeRef" 
class="filter-tree" 
:data="treeData" 
:props="defaultProps"
 node-key=id highlight-current
 :current-node-key="leafNode.id"
 @node-click="treeNodeClick" 
default-expand-all 
show-checkbox
 @check="check"
      :default-checked-keys="checKay" />

1、ref="treeRef":给 <el-tree> 组件设置一个引用名,可以在 JavaScript 中通过这个引用名来操作该组件。

2、:data="treeData":将 treeData 绑定到 <el-tree> 的 data 属性上,这个属性是树形结构的数据源,用于渲染树节点。

3、:props="defaultProps":将 defaultProps 绑定到 <el-tree> 的 props 属性上,这个属性用于指定树节点的一些属性配置,比如子节点的键名和显示内容的键名。

4、node-key="id":指定树节点数据中用作节点唯一标识的字段名。

5、highlight-current:当节点被选中时,高亮显示该节点。

6、:current-node-key="leafNode.id":设置当前被选中的节点的 key,通常用于在树中显示当前选中的节点。

7、@node-click="treeNodeClick":当点击树节点时触发 treeNodeClick 方法。

8、default-expand-all:默认展开所有的树节点。

9、show-checkbox:显示复选框,允许用户通过复选框选择树节点。

10、@check="check":当复选框状态发生变化时触发 check 方法。

11、:default-checked-keys="checKay":将 checKay 绑定到 <el-tree> 的 default-checked-keys 属性上,用于设置默认选中的节点的 key。

B、js部分

通过官网告诉我们的方法,我们点击节点,打印我们可以发现,选中的时候是放到这个数组里面的

const check = (node, checked) => {
  if (checked) {
    // 选中节点
    console.log(node, checked);
    leafNode.value = node;
  } else {
    // 取消选中节点
    if (node.id === leafNode.value.id) {
      leafNode.value = {};
    }
  }
};

我们知道default-checked-keys是树结构默认勾选的数组

const checKay = ref([])这个是我定义的默认勾选的数组

当我的选择框为全部 的时候,我只需要把树结构default-checked-keys存放的为全部数据的id即可

const handleSelectAllChange = (value) => {
  if (value == "all") {
    checKay.value = getAllIds(treeData.value)

  } else {
    // 如果取消选择全部,则遍历树节点并取消选中所有节点
    checKay.value = []
    nextTick(() => {
      treeRef.value.setCheckedKeys([]);
    });
  }
};
// 递归函数,获取所有节点的 id
const getAllIds = (nodes) => {
  let ids = [];
  nodes.forEach((node) => {
    ids.push(node.id);
    if (node.children) {
      ids = [...ids, ...getAllIds(node.children)];
    }
  });
  r

当不为全部的时候,树全部不选,其实就是将这个数组给清空   就行了

checKay.value = []

我直接写,发现,树并没有取消勾选,

这时候需要首先清空 checKay.value,然后使用 nextTick 方法等待下一个 DOM 更新周期,并在其中调用 treeRef.value.setCheckedKeys([]) 来清空树节点的选中状态

checKay.value = []
    nextTick(() => {
      treeRef.value.setCheckedKeys([]);
    });

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对你的问题,elementUI 的级联选择器(Cascader)组件提供了一些属性和方法,可以实现全选/取消全选和按勾选顺序回显排序的功能。 1. 全选/取消全选 elementUI 的级联选择器(Cascader)组件提供了一个 checkStrictly 属性,可以控制级联选择器是否可以全选取消全选。当 checkStrictly 为 true 时,级联选择器可以全选取消全选;当 checkStrictly 为 false 时,级联选择器只能单选或多选。 2. 按勾选顺序回显排序 elementUI 的级联选择器(Cascader)组件提供了一个 value 属性,可以设置级联选择器的选中项。当级联选择器的选项是固定的时候,可以通过设置 value 属性来回显选中项;当级联选择器的选项是动态生成的时候,可以通过监听级联选择器的 change 事件,获取选中项的顺序和值,并进行排序和回显。 下面是一个简单的示例代码,实现了全选/取消全选和按勾选顺序回显排序的功能: ```html <template> <el-cascader :options="options" :check-strictly="true" :value="selectedItems" @change="handleChange" @expand-change="handleExpandChange" @clear="handleClear" ></el-cascader> </template> <script> export default { data() { return { options: [ { value: 'zhinan', label: '指南', children: [ { value: 'shejiyuanze', label: '设计原则', children: [ { value: 'yizhi', label: '一致' }, { value: 'fankui', label: '反馈' }, { value: 'xiaolv', label: '效率' }, { value: 'kekong', label: '可控' }, ], }, { value: 'daohang', label: '导航', children: [ { value: 'cexiangdaohang', label: '侧向导航' }, { value: 'dingbudaohang', label: '顶部导航' }, ], }, ], }, ], selectedItems: [], }; }, methods: { handleChange(value, selectedItems) { this.selectedItems = selectedItems; }, handleExpandChange() { // do something }, handleClear() { this.selectedItems = []; }, }, }; </script> ``` 在上面的示例代码中,我们通过设置 checkStrictly 属性为 true,开启了全选/取消全选的功能。同时,我们监听了级联选择器的 change 事件,在选中项发生变化时,更新 selectedItems 数组的值,并实现了按勾选顺序回显排序的功能。 希望这个回答对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值