v-for 与ref配合使用,this.$refs.key 返回的是组件数组

文章参考

  1. Vue 官网访问子组件实例或子元素
  2. v-for中使用ref属性

问题描述

  1. 工作中的项目需要选择人员和机构,已经封装为组件,可以选择机构和根据机构找人
  2. 业务中需要动态添加多个个预约记录,一条预约记录中需要选择人员和相关机构,有的是多选,有的是单选
  3. 添加的时候组件没有数据,可以用户选择
  4. 编辑修改的时候,后台返回数据,组件要使用v-for循环,组件内部的值使用$refs去寻找,然后赋值给相关组件

过程分析

ref 使用简单说明

<base-input ref="usernameInput"></base-input>
this.$refs.usernameInput

ref 和 v-for 配合使用

  1. 自己想着在v-for循环的时候,保证 ref的字符串唯一即可,这样就可以通过 this.$refs[唯一字符串]去找到组件,结果调试一直提示 undefined,异常报错

  2. 找了同事一点一点的调试最后发现, this.$refs[唯一字符串] 返回的不是组件,而是一个组件数组对象

案例说明

官方解释:当 ref 和 v-for 一起使用的时候,你得到的 ref 将会是一个包含了对应数据源的这些子组件的数组。

在这里插入图片描述

在这里插入图片描述

this.$refs['caseInfo' + arrIndex][0].selectedId = tempFormData.caseDto.caseIndexCode
可以在点击节点选择框时,触发一个方法来实现这个功能。首先,获取到当前节点的checked状态,可以使用`node.checked`属性;然后,遍历整个目录树,将除了当前节点以外的节点的checked状态都置为false,可以使用`this.$refs.tree1.setCheckedKeys(keys, checked, deep)`方法,其中`keys`为需要设置的节点的key组成的数组,`checked`为需要设置的checked状态,`deep`表示是否深度遍历。 下面是一个示例代码: ```html <template> <el-tree :data="data" show-checkbox ref="tree1" @check="handleCheck"></el-tree> </template> <script> export default { data() { return { data: [ { id: 1, label: '一级 1', children: [ { id: 11, label: '二级 1-1', children: [ { id: 111, label: '三级 1-1-1', }, { id: 112, label: '三级 1-1-2', }, ], }, { id: 12, label: '二级 1-2', }, ], }, { id: 2, label: '一级 2', children: [ { id: 21, label: '二级 2-1', }, { id: 22, label: '二级 2-2', }, ], }, ], }; }, methods: { handleCheck(node, checked) { // 获取当前节点的checked状态 const isChecked = node.checked; // 遍历整个目录树,将除了当前节点以外的节点的checked状态都置为false const keys = this.$refs.tree1.getCheckedKeys(); keys.splice(keys.indexOf(node.key), 1); this.$refs.tree1.setCheckedKeys(keys, false, true); // 打印当前节点的checked状态 console.log(`节点 ${node.label} 的checked状态为 ${isChecked}`); }, }, }; </script> ``` 在上面的示例中,当用户点击节点选择框时,会触发`handleCheck`方法。该方法首先获取当前节点的checked状态,然后通过`this.$refs.tree1.getCheckedKeys()`方法获取当前目录树中所有被选中的节点的key组成的数组,再通过`keys.splice(keys.indexOf(node.key), 1)`方法将当前节点的key数组中删除,最后使用`this.$refs.tree1.setCheckedKeys(keys, false, true)`方法将除了当前节点以外的节点的checked状态都置为false。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值