element-plus的el-tree的双向绑定示例代码

 更新时间:2024年12月09日 14:24:33   作者:i_am_a_div_日积月累_  
这篇文章主要介绍了element-plus的el-tree的双向绑定的示例代码,代码简单易懂,结合图文给大家展示,感兴趣的朋友跟随小编一起看看吧

el-tree改造了下
可选可取消 有默认值 不包含父级id(也可打开注释 包含父级id) 默认展开 点击节点也可触发选择 节点内容自定义

<template>
  <div class="absolute">
    <el-scrollbar class="pall">
      <div class="ball mb radius overflow">
        <div class="bb" style="background: rgba(124, 162, 121, 0.1); padding: 4px 16px;">
          <el-checkbox @change="selectCheckBox($event,1)">拓扑图树结构</el-checkbox>
        </div>
        <!--
      default-checked-keys:默认展开值(正常来说需要包含父级id的 但是我们后端不要后端id )
      show-checkbox:多选框
      node-key:每个树节点用来作为唯一标识的属性,整棵树应该是唯一的
      default-expand-all:是否默认展开所有节点
      expand-on-click-node:是否在点击节点的时候展开或者收缩节点, 默认值为 true,如果为 false,则只有点箭头图标的时候才会展开或者收缩节点
      default-checked-keys:默认勾选的节点的 key 的数组
      check-on-click-node:是否在点击节点的时候选中节点,默认值为 false,即只有在点击复选框时才会选中节点
      props:配置选项,具体看下表
      -->
        {{ childKeys }}
        <div style="padding: 4px 20px">
          <el-tree :key="keyIndex" ref="treeRef" class="tree_ref" style="max-width: 600px" :data="data" show-checkbox
            node-key="id" :default-expand-all="true" :expand-on-click-node='false' :default-checked-keys="childKeys"
            :check-on-click-node="true" :props="defaultProps" @check-change="checkChange">
            <template #default="{ node, data }">
              <span class="custom-tree-node">
                <span>{{ node.label }}</span>
                <span style="color:red;margin-left: 10px">id:{{data.id }}</span>
              </span>
            </template>
          </el-tree>
        </div>
      </div>
    </el-scrollbar>
  </div>
</template>
<script setup>
import { ref } from 'vue';
let treeRef = ref(null);
let childKeys = ref([5, 10]); // 初始化选中子节点的 ID
const defaultProps = {
  children: 'children',
  label: 'label',
};
let keyIndex = ref(1) // 注意该key在需要全id和只需要子集id的时候用法不同
const data = [
  {
    id: 1,
    label: 'Level one 1',
    children: [
      {
        id: 4,
        label: 'Level two 1-1',
        children: [
          {
            id: 9,
            label: 'Level three 1-1-1',
          },
          {
            id: 10,
            label: 'Level three 1-1-2',
          },
        ],
      },
    ],
  },
  {
    id: 2,
    label: 'Level one 2',
    children: [
      {
        id: 5,
        label: 'Level two 2-1',
      },
      {
        id: 6,
        label: 'Level two 2-2',
      },
    ],
  },
  {
    id: 3,
    label: 'Level one 3',
    children: [
      {
        id: 7,
        label: 'Level two 3-1',
      },
      {
        id: 8,
        label: 'Level two 3-2',
      },
    ],
  },
];
const checkChange = () => {
  // 获取所有选中的节点对象
  const checkedNodes = treeRef.value.getCheckedNodes();
  // // 结果1:获取包含父节点的id
  // childKeys.value = treeRef.value.getCheckedKeys()
  // 结果2:提取子节点的 ID,不包括父节点
  childKeys.value = checkedNodes
    .filter(node => !node.children) // 只保留没有子节点的节点
    .map(node => node.id); // 提取 ID
  console.log('默认值', childKeys.value, checkedNodes); // 只包含子节点的 ID
  keyIndex.value++
}
// 手动全选
const selectCheckBox = (value, num) => {
  // console.log(value, num);
  // // 结果1:获取包含父节点的id
  // if (value) {
  //   childKeys.value = getAllNodeIds(data)
  //   console.log('所有层级id', getAllNodeIds(data));
  // } else {
  //   // 取消勾选所有节点
  //   childKeys.value = []
  //   treeRef.value.setCheckedKeys([]);
  // }
  // keyIndex.value++
  // 结果2:提取子节点的 ID,不包括父节点
  if (value) {
    // 勾选所有节点
    const allKeys = data.flatMap(node => getAllNodeKeys(node));
    treeRef.value.setCheckedKeys(allKeys);
  } else {
    childKeys.value = []
    // 取消勾选所有节点
    treeRef.value.setCheckedKeys([]);
  }
};
const getAllNodeKeys = (node) => {
  let keys = [node.id];
  if (node.children) {
    node.children.forEach(child => {
      keys = keys.concat(getAllNodeKeys(child));
    });
  }
  console.log(keys);
  return keys;
}
// 递归函数获取所有节点的 ID
const getAllNodeIds = (nodes) => {
  let ids = [];
  nodes.forEach(node => {
    ids.push(node.id); // 添加当前节点的 ID
    if (node.children) {
      ids = ids.concat(getAllNodeIds(node.children)); // 递归调用以获取子节点的 ID
    }
  });
  return ids;
};
</script>
<style lang="scss" scoped>
:deep(.tree_ref) {
  margin-left: 12px;
  .el-tree-node__expand-icon {
    display: none;
  }
}
</style>

到此这篇关于element-plus的el-tree的双向绑定的文章就介绍到这了,更多相关element-plus el-tree双向绑定内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue计算属性get和set用法示例

    vue计算属性get和set用法示例

    这篇文章主要介绍了vue计算属性get和set用法,结合实例形式分析了计算属性的功能及get和set用法的具体使用技巧,需要的朋友可以参考下
    2019-02-02
  • 关于vue表单提交防双/多击的例子

    关于vue表单提交防双/多击的例子

    今天小编就为大家分享一篇关于vue表单提交防双/多击的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • 使用reactive导致数据失去响应式的原因和解决方案

    使用reactive导致数据失去响应式的原因和解决方案

    在 Vue 的响应式系统中,reactive 对象是一个深度代理,它会追踪对象属性的变更,但如果你将整个对象重新赋值,那么 Vue 无法继续追踪新的对象,本文给大家介绍了使用reactive导致数据失去响应式的原因和解决方案,需要的朋友可以参考下
    2024-09-09
  • 解决Vue + Echarts 使用markLine标线(precision精度问题)

    解决Vue + Echarts 使用markLine标线(precision精度问题)

    这篇文章主要介绍了解决Vue + Echarts 使用markLine标线(precision精度问题),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Vue中select下拉框的默认选中项的三种情况解读

    Vue中select下拉框的默认选中项的三种情况解读

    这篇文章主要介绍了Vue中select下拉框的默认选中项的三种情况解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • vue3中如何通过ref和$parent结合defineExpose实现父子组件之间的通信

    vue3中如何通过ref和$parent结合defineExpose实现父子组件之间的通信

    这篇文章主要介绍了vue3中通过ref和$parent结合defineExpose实现父子组件之间的通信,Vue3中通过ref和$parent的结合使用,及defineExpose的方法,可以非常便捷地实现父子组件之间的通信,需要的朋友可以参考下
    2023-07-07
  • vant-list上拉加载onload事件触发多次问题及解决

    vant-list上拉加载onload事件触发多次问题及解决

    这篇文章主要介绍了vant-list上拉加载onload事件触发多次问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 前端Vue页面中展示本地图片简单代码示例

    前端Vue页面中展示本地图片简单代码示例

    今天遇到一个在vue文件中引入本地图片的问题,于是有了这篇文章,本文主要给大家介绍了关于前端Vue页面中展示本地图片的相关资料,需要的朋友可以参考下
    2023-12-12
  • Vue中使用this.$set()如何新增数据,更新视图

    Vue中使用this.$set()如何新增数据,更新视图

    这篇文章主要介绍了Vue中使用this.$set()实现新增数据,更新视图方式。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • vue中created和mounted的区别浅析

    vue中created和mounted的区别浅析

    这篇文章主要给大家介绍了关于vue中created和mounted区别的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08

最新评论