el-tree的使用及控制全选、反选、获取选中

el-tree的使用及控制全选、反选、获取选中

组件使用

  1. 引入组件,可以参考官网组件引入
  2. 参考官网示例写好基础数据结构,不知道怎么转换树形机构的看文章:一维数组转树形
html 复制代码
<template>
  <el-tree
    style="max-width: 600px"
    :data="data"
    :props="props"
    show-checkbox
  />
</template>

<script setup>
const handleNodeClick = (data) => {
  console.log(data)
}

const data = [
  {
    label: 'Level one 1',
    children: [
      {
        label: 'Level two 1-1',
        children: [
          {
            label: 'Level three 1-1-1',
          },
        ],
      },
    ],
  },
  {
    label: 'Level one 2',
    children: [
      {
        label: 'Level two 2-1',
        children: [
          {
            label: 'Level three 2-1-1',
          },
        ],
      },
      {
        label: 'Level two 2-2',
        children: [
          {
            label: 'Level three 2-2-1',
          },
        ],
      },
    ],
  },
  {
    label: 'Level one 3',
    children: [
      {
        label: 'Level two 3-1',
        children: [
          {
            label: 'Level three 3-1-1',
          },
        ],
      },
      {
        label: 'Level two 3-2',
        children: [
          {
            label: 'Level three 3-2-1',
          },
        ],
      },
    ],
  },
]

const props= {
  children: 'children',
  label: 'label',
}
</script>

获取选中的id

通过获取tree组件,操作方法进行获取

  1. 给组件绑定一个ref
html 复制代码
<el-tree ref="treeRef" node-key="id" style="max-width: 600px" :props="props" :data="data" show-checkbox />
  1. 声明变量
js 复制代码
const treeRef = ref(null)
  1. 操作组件方法
js 复制代码
// 获取选中数据
const handleCheckChange = () => {
  // 方法一:获取key,此方法必须设置属性node-key!!!
  console.log(treeRef.value.getCheckedKeys(false))// 返回被选中的key,也就是id
  // 方法二:获取节点node
  console.log(treeRef.value.getCheckedNodes(false))// 返回被选中的对象
}

全选实现

思路:获取全部的key,也就是id,然后通过赋值的操作来实现效果

js 复制代码
// 用于判断是全选还是取消
let isAll = false;
// 全选
const all = () => {
  if (isAll) {
    treeRef.value.setCheckedKeys([], false)
    isAll = false
  } else {
    // 获取所以的id,如果有一维数组,则直接循环获取即可
    const nodeKeys = [];
    function getAllKeys(data) {
      data.forEach(node => {
        nodeKeys.push(node.id);
        if (node.children) {
          getAllKeys(node.children);
        }
      });
    }
    getAllKeys(treeData.value);
    treeRef.value.setCheckedKeys(nodeKeys, false)
    isAll = true
  }
}

反选实现

思路:

  1. 获取当前选中的key
  2. 全部选中
  3. 将第一步获取的key节点设置为取消
js 复制代码
// 反选
const reverse = () => {
  // 1. 获取当前选中的key
  let checked = treeRef.value.getCheckedKeys(false);
  // 2. 全部选中
  const nodeKeys = [];
  function getAllKeys(data) {
    data.forEach(node => {
      nodeKeys.push(node.id);
      if (node.children) {
        getAllKeys(node.children);
      }
    });
  }
  getAllKeys(treeData.value);
  treeRef.value.setCheckedKeys(nodeKeys, false)
  // 3. 将第一步获取的key节点设置为取消
  checked.forEach(val => {
    treeRef.value.setChecked(val, false)
  })
}

全部代码

html 复制代码
<template>
  <el-tree
    style="max-width: 600px"
    :data="data"
    :props="props"
    show-checkbox
    ref="treeRef"
  />
  <el-button type="primary" @click="handleCheckChange">获取选中数据</el-button>
  <el-button type="primary" @click="all">全选</el-button>
  <el-button type="primary" @click="reverse">反选</el-button>
</template>

<script setup>
import { ref } from 'vue';
const treeRef = ref(null)
const handleNodeClick = (data) => {
  console.log(data)
}

const data = [
  {
    label: 'Level one 1',
    children: [
      {
        label: 'Level two 1-1',
        children: [
          {
            label: 'Level three 1-1-1',
          },
        ],
      },
    ],
  },
  {
    label: 'Level one 2',
    children: [
      {
        label: 'Level two 2-1',
        children: [
          {
            label: 'Level three 2-1-1',
          },
        ],
      },
      {
        label: 'Level two 2-2',
        children: [
          {
            label: 'Level three 2-2-1',
          },
        ],
      },
    ],
  },
  {
    label: 'Level one 3',
    children: [
      {
        label: 'Level two 3-1',
        children: [
          {
            label: 'Level three 3-1-1',
          },
        ],
      },
      {
        label: 'Level two 3-2',
        children: [
          {
            label: 'Level three 3-2-1',
          },
        ],
      },
    ],
  },
]

const props= {
  children: 'children',
  label: 'label',
}
// 获取选中数据
const handleCheckChange = () => {
  // 方法一:获取key,此方法必须设置属性node-key!!!
  console.log(treeRef.value.getCheckedKeys(false))// 返回被选中的key,也就是id
  // 方法二:获取节点node
  console.log(treeRef.value.getCheckedNodes(false))// 返回被选中的对象
}

// 用于判断是全选还是取消
let isAll = false;
// 全选
const all = () => {
  if (isAll) {
    treeRef.value.setCheckedKeys([], false)
    isAll = false
  } else {
    // 获取所以的id,如果有一维数组,则直接循环获取即可
    const nodeKeys = [];
    function getAllKeys(data) {
      data.forEach(node => {
        nodeKeys.push(node.id);
        if (node.children) {
          getAllKeys(node.children);
        }
      });
    }
    getAllKeys(treeData.value);
    treeRef.value.setCheckedKeys(nodeKeys, false)
    isAll = true
  }
}

// 反选
const reverse = () => {
  // 1. 获取当前选中的key
  let checked = treeRef.value.getCheckedKeys(false);
  // 2. 全部选中
  const nodeKeys = [];
  function getAllKeys(data) {
    data.forEach(node => {
      nodeKeys.push(node.id);
      if (node.children) {
        getAllKeys(node.children);
      }
    });
  }
  getAllKeys(treeData.value);
  treeRef.value.setCheckedKeys(nodeKeys, false)
  // 3. 将第一步获取的key节点设置为取消
  checked.forEach(val => {
    treeRef.value.setChecked(val, false)
  })
}
</script>
相关推荐
VX:Fegn089513 分钟前
计算机毕业设计|基于springboot + vue非遗传承文化管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
在掘金8011033 分钟前
RequireJS 详解
前端·javascript
cindershade35 分钟前
我对防抖(Debounce)的一点理解与实践:从基础到立即执行
javascript
Dwzun1 小时前
基于SpringBoot+Vue的农产品销售系统【附源码+文档+部署视频+讲解)
数据库·vue.js·spring boot·后端·毕业设计
morning_judger1 小时前
JavaScript封装演进史:从全局变量到闭包
开发语言·javascript
spencer_tseng1 小时前
jquery.min.js v1.12.4
javascript·jquery
飛6791 小时前
玩转 Flutter 自定义 Painter:从零打造丝滑的仪表盘动效与可视化图表
开发语言·javascript·flutter
JIngJaneIL1 小时前
基于Java+ vueOA工程项目管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
蓝鲸屿1 小时前
JS基础第九天——对象(2)+Random
开发语言·前端·javascript
爱看书的小沐2 小时前
【小沐学WebGIS】基于Three.JS绘制二三维地图地球晨昏效果(WebGL / vue / react )
javascript·vue.js·gis·webgl·three.js·opengl·晨昏线