elementUI的el-tree的赋值回显问题

博客主要围绕el-tree组件的default-checked-keys属性展开,介绍正常回显已选中值用该属性,但传值需传递父节点值。还提到保存后再次编辑回显时系统管理会自动勾选,回显菜单树需对返回数据处理,去掉系统管理菜单的id,指出tree组件坑较多。
部署运行你感兴趣的模型镜像

el-tree

default-checked-keys

正常回显已经选中的值是 用(default-checked-keys)这个属性

// An highlighted block  
<el-tree
  ref="menuTree"
  :data="allMenu"
  show-checkbox
  node-key="id"
  :default-expand-all="true"
  :default-checked-keys="roleMenu"
  :props="defaultProps"
  @check="changeMenu">
</el-tree>
// 点击保存传值时需要将两个数组合并
const menuIds = this.$refs.menuTree.getCheckedKeys()
const halfMenuIds = this.$refs.menuTree.getHalfCheckedKeys()
const allMenuIds = menuIds.concat(halfMenuIds)

但是由于传值时需要把父节点的值传递过去。getCheckedKeys + getHalfCheckedKeys。

保存时如下图

+在这里插入图片描述

保存后再次编辑时回显会如下图一样 (系统管理会自动勾选中)

在这里插入图片描述

回显菜单树时需要对返回的数据处理,把系统管理 菜单 的id去掉

// allMenu就是整个菜单树 []
// roleMenu 就是当前选中的菜单id数组节点 ['111', '2222']
// 循环遍历整个树  
 const newRoleMenu = [] // 处理数据后的菜单数组
 this.allMenu.forEach(item => {
    if (this.roleMenu.includes(item.id)) {
      if (item.hasChildren) { // 是否有子菜单
      	// 默认一级菜单 下的子菜单,都选中时保留该id, 否则去掉
        let isAllChecked = true 
        item.children.forEach(subItem => {
          if (isAllChecked && !this.roleMenu.includes(subItem.id)) {
            isAllChecked = false
          }
          if (this.roleMenu.includes(subItem.id)) {
            newRoleMenu.push(subItem.id)
          }
        })
        if (isAllChecked) {
          newRoleMenu.push(item.id)
        }
      } else {
        newRoleMenu.push(item.id)
      }
    }
  })

有问题可以评论沟通交流,tree的坑还是较多

链接: elemetUI el-drawer头部样式问题,header样式被黑线框住.

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

<think> 我们正在讨论Vue 3中el-tree组件的数据实现方法。请注意,el-treeElement Plus库中的树形组件。 数据通常是指在编辑表单时,将已经保存的数据重新示在表单中。对于树形组件,通常包括选中节点(可能还包括展开节点)。 在el-tree中,选中的节点主要是通过绑定`default-checked-keys`属性(非受控)或使用`setCheckedKeys`方法(受控)来实现的。 由于Vue 3是响应式的,我们通常使用受控的方式来动态设置选中的节点会更灵活。 实现步骤: 1. 获取需要的数据(通常是从后端接口获取的节点key数组) 2. 使用el-tree的`setCheckedKeys`方法来设置选中的节点 注意:el-tree需要先加载节点数据,然后才能设置选中的节点。因此,在数据加载完成后(比如在`mounted`生命周期或者使用`watch`监听数据变化)再进行设置。 示例代码: 假设我们有一个el-tree组件,并且已经绑定了节点数据`treeData`,节点的唯一标识使用`node-key`属性指定(例如设置为'id')。 在模板中: ```html <el-tree ref="treeRef" :data="treeData" show-checkbox node-key="id" :props="defaultProps" > </el-tree> ``` 在脚本中: ```javascript import { ref, onMounted } from 'vue'; export default { setup() { const treeRef = ref(null); // 用于引用el-tree组件 const treeData = ref([]); // 树节点数据 const defaultProps = { children: 'children', label: 'name' }; // 模拟从后端获取的选中节点key数组 const checkedKeys = ref([1, 3, 5]); // 假设这些key是选中的节点 onMounted(async () => { // 假设这里异步获取树节点数据 // 例如:treeData.value = await fetchTreeData(); // 然后设置选中的节点 // 注意:确保树数据已经加载完成,再设置选中节点 // 可以使用nextTick确保DOM更新 // 或者如果数据是异步获取的,则在获取数据后设置 // 这里假设数据已经赋值treeData,然后设置选中节点 if (treeRef.value) { treeRef.value.setCheckedKeys(checkedKeys.value); } }); return { treeRef, treeData, defaultProps, checkedKeys }; } }; ``` 注意事项: 1. 如果树数据是异步加载的,则需要在数据加载完成后再调用`setCheckedKeys`方法。可以在获取数据的Promise的then方法中调用,或者使用watch监听treeData的变化(确保数据已经加载完毕)。 2. 如果节点的key不是id,需要根据实际情况设置`node-key`属性。 3. 如果树很大,可能需要考虑性能问题,比如使用懒加载等。 另外,如果需要展开状态,可以使用`default-expanded-keys`属性(非受控)或者使用`expandKeys`(受控)结合`setExpandedKeys`方法。 问题:如果数据是懒加载的,则选中的节点需要在每个节点加载时判断是否选中,此时可能需要使用其他方式(例如在节点数据中预先标记选中状态,并在懒加载时处理)。 以上是基于Element Plus的el-tree组件的常用方法。 生成相关问题: 1.Vue 3中,如何动态更新el-tree的选中节点? 2. el-tree组件懒加载模式下如何实现数据? 3. 如何保存和恢复el-tree的展开状态? 4.Element Plus中,el-tree的`setCheckedKeys`方法不生效可能的原因是什么? </think> ### Vue 3中el-tree组件数据的实现方法 在Vue 3中使用Element Plus的el-tree组件实现数据,主要通过以下步骤完成: #### 1. **关键配置** ```vue <el-tree ref="treeRef" :data="treeData" show-checkbox node-key="id" <!-- 必须指定节点唯一标识 --> :props="defaultProps" :default-checked-keys="defaultCheckedKeys" <!-- 关键属性 --> /> ``` #### 2. **脚本实现** ```javascript import { ref, reactive, onMounted } from 'vue' export default { setup() { const treeRef = ref(null) // 树形数据结构 const treeData = ref([ { id: 1, label: '一级节点', children: [ { id: 4, label: '二级节点-1' }, { id: 5, label: '二级节点-2' } ]} ]) // 需要的节点ID数组 (从接口获取) const defaultCheckedKeys = ref([4, 5]) // 节点配置 const defaultProps = { children: 'children', label: 'label' } // 获取当前选中节点(验证) const getCheckedNodes = () => { console.log(treeRef.value.getCheckedNodes()) } // 动态更新数据 const updateCheckedKeys = () => { defaultCheckedKeys.value = [1, 5] // 新选中节点 } return { treeData, defaultProps, defaultCheckedKeys, treeRef, getCheckedNodes } } } ``` #### 3. **实现要点** 1. **`node-key`必填** 必须指定节点唯一标识字段(如`id`),这是正确的基础[^1]。 2. **数据格式要求** 数据必须是节点ID数组,如:`[1, 4, 5]`,与`node-key`指定的字段对应。 3. **动态更新方式** - 初始:使用`:default-checked-keys`属性 - 动态更新:直接修改`defaultCheckedKeys`数组(Vue 3响应式自动更新) 4. **获取选中状态** 通过组件引用调用方法: ```javascript treeRef.value.getCheckedKeys() // 获取选中ID数组 treeRef.value.getCheckedNodes() // 获取选中节点对象 ``` #### 4. **完整示例场景** ```javascript // 模拟从API获取数据 onMounted(async () => { const res = await fetch('/api/checked-nodes') defaultCheckedKeys.value = res.data.ids }) ``` #### 5. **常见问题解决** - **部分节点未** → 检查父节点是否被禁用,或使用`check-strictly`属性 - **动态数据延迟** → 在`nextTick`中调用`treeRef.value.setCheckedKeys()` - **半选状态处理** → 使用`getHalfCheckedKeys()`方法
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值