VUE循环动态添加ref属性,及动态判断获取哪个

上代码:HTML

<div

        v-for="Item in optimizeList"   //这里举个例子,想循环什么,自己去赋值就行

        :key="Item.appId"

        class="classify_item"

        >                                              //↓↓↓这个是按钮绑定的事件(传进来的是循环生成的 Item 对象)

<svg-icon class-name="search-icon" icon-class="展开2" @click="OpenClick(Item)" />

        <div class="com" :ref="Item.pym">

                <p>这里是每次都会动态生成的带不同  ref 的div (注意 ref 前边的冒号别丢了)</p>

                <p>控制显示/隐藏,也是用上边的按钮控制这个div显示/隐藏</p>

        </div>

 </div>

 js代码:

OpenClick(e) {

this.$refs[e.pym][0].classList.toggle('dis')

},


特别注意:  this.$refs[e.pym][0] 这个双方括号取值语法  很关键,我就在这浪费2小时

特别注意:  classList.toggle('dis')   class的特别方法,也特别好用(没有就添加这个属性,   有就  删除) 可以很好的利用这一特性控制同一按钮 点击添加属性 再点击删除属性


css代码:

.dis{

display: none;

}

<think>好的,我现在要回答用户关于如何在Vue3中连续获取多个ref引用的问题。首先,我需要回忆一下Vue3中ref的基本用法,然后结合用户提供的引用内容来整理步骤和示例。 用户提到了引用[2]中如何在Vue3中使用ref访问DOM元素,步骤包括引入ref函数、创建ref对象、绑定到模板、访问DOM元素。现在的问题是如何连续获取多个ref,可能需要处理多个DOM元素或组件实例。 首先,我需要确定用户所说的“连续获取多个ref”具体指什么。可能的情况有两种:一种是同时获取多个不同的ref对象,比如多个表单输入框;另一种是动态生成的多个元素,比如v-for循环中的元素,每个都需要单独的ref。 对于第一种情况,常规做法是为每个元素或组件分别创建ref对象。例如,在模板中给不同的元素设置不同的ref属性,然后在setup中分别定义对应的ref变量,并在onMounted中访问它们。这种情况下,每个ref都是独立的,可以通过变量名来访问。 第二种情况是动态生成的元素,比如使用v-for循环渲染的列表项,每个项都需要单独的ref。这时候,可能需要使用数组或对象来存储多个refVue3中可以通过函数形式的ref动态处理,或者使用ref数组。例如,在模板中使用:ref="(el) => { if (el) itemRefs[index] = el }",然后在setup中定义一个响应式数组itemRefs来保存这些ref。 另外,用户提供的引用[4]提到了动态表单组件的校验,可能需要获取多个表单组件的ref并进行统一校验。这时候,可能需要将这些ref存储在一个数组或对象中,便于遍历和操作。 接下来需要给出具体的步骤和示例代码。根据引用[2]中的步骤,首先是引入ref,然后创建ref对象,绑定到模板,访问。对于多个ref的情况,可能需要多个ref变量,或者使用数组存储。 例如,静态多个ref的情况: 在模板中: <template> <input ref="input1Ref" /> <input ref="input2Ref" /> <child-component ref="childRef" /> </template> 在script中: import { ref, onMounted } from 'vue'; setup() { const input1Ref = ref(null); const input2Ref = ref(null); const childRef = ref(null); onMounted(() => { console.log(input1Ref.value); // 第一个input元素 console.log(input2Ref.value); // 第二个input元素 console.log(childRef.value); // 子组件实例 }); return { input1Ref, input2Ref, childRef }; } 对于动态生成的元素,比如v-for循环中的多个元素,可以使用函数形式的ref: <template> <div v-for="(item, index) in list" :key="index" :ref="(el) => setItemRef(el, index)"> {{ item }} </div> </template> <script> import { ref, onMounted } from 'vue'; export default { setup() { const list = ref([1, 2, 3]); const itemRefs = ref([]); const setItemRef = (el, index) => { if (el) { itemRefs.value[index] = el; } }; onMounted(() => { console.log(itemRefs.value); // 所有div元素的数组 }); return { list, setItemRef }; } }; </script> 这里需要注意,在v-for中使用函数ref时,当元素被销毁时,el参数会是null,所以需要处理这种情况,或者使用响应式数组来维护当前存在的元素引用。 另外,用户可能还需要在组合式API中使用这些ref,比如在提交表单时校验多个输入框的值。这时,可以将所有相关的ref存储在一个对象或数组中,方便统一处理。 总结步骤: 1. 引入ref函数。 2. 创建多个独立的ref变量或使用数组/对象来保存多个ref。 3. 在模板中绑定对应的ref属性。 4. 在onMounted或需要的时候访问这些ref的值。 需要注意的是,在setup函数中,ref变量需要在return中暴露给模板,否则无法正确绑定。同时,动态生成的ref可能需要使用函数形式来捕获每个元素的引用,尤其是在v-for循环中。 最后,需要验证示例代码的正确性,确保语法正确,比如使用ref数组时的处理,以及访问时机的正确性(如在onMounted之后才能确保DOM已经渲染完成)。</think>### 在Vue3中连续获取多个ref引用的方法 在Vue3中,连续获取多个`ref`引用的核心思路是通过**独立声明多个`ref`对象**或**动态绑定函数式`ref`**来实现。以下是具体方法及示例: --- #### 一、静态获取多个独立ref 适用于明确需要获取多个固定元素或组件引用的场景。 ##### 实现步骤: 1. **引入`ref`函数**:从`vue`包中导入`ref`。 2. **声明多个`ref`变量**:为每个需要引用的元素或组件创建独立的`ref`对象。 3. **模板绑定`ref`属性**:在模板中通过同名`ref`属性绑定到元素或组件。 4. **访问`ref`值**:在`onMounted`生命周期或事件中操作引用。 ##### 示例代码: ```vue <template> <input ref="input1Ref" placeholder="输入框1" /> <input ref="input2Ref" placeholder="输入框2" /> <ChildComponent ref="childRef" /> </template> <script> import { ref, onMounted } from 'vue'; import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, setup() { const input1Ref = ref(null); const input2Ref = ref(null); const childRef = ref(null); onMounted(() => { console.log(input1Ref.value); // 第一个输入框DOM元素 console.log(input2Ref.value); // 第二个输入框DOM元素 console.log(childRef.value); // ChildComponent组件实例 }); return { input1Ref, input2Ref, childRef }; } }; </script> ``` --- #### 二、动态获取多个ref(如v-for循环) 适用于动态生成的元素列表,需要批量获取引用。 ##### 实现步骤: 1. **创建响应式数组存储引用**:使用`ref([])`初始化一个数组。 2. **模板绑定函数式`ref`**:通过`:ref`绑定一个函数,动态将元素添加到数组中。 3. **处理引用更新**:在函数中判断元素有效性,避免因元素销毁导致的`null`值。 ##### 示例代码: ```vue <template> <div v-for="(item, index) in list" :key="index" :ref="(el) => setItemRef(el, index)"> {{ item }} </div> </template> <script> import { ref, onMounted } from 'vue'; export default { setup() { const list = ref(['A', 'B', 'C']); const itemRefs = ref([]); const setItemRef = (el, index) => { if (el) { itemRefs.value[index] = el; // 元素存在时保存引用 } }; onMounted(() => { console.log(itemRefs.value); // 所有div元素的数组 }); return { list, setItemRef }; } }; </script> ``` --- #### 三、统一操作多个ref(如表单校验) 适用于需要批量操作多个组件或元素的场景,如表单校验[^4]。 ##### 示例代码(动态表单校验): ```vue <template> <form> <input v-for="(field, i) in fields" :key="i" :ref="(el) => setFieldRef(el, i)" /> <button @click="validateAll">提交校验</button> </form> </template> <script> import { ref } from 'vue'; export default { setup() { const fields = ref([{}, {}, {}]); // 动态表单字段 const fieldRefs = ref([]); const setFieldRef = (el, index) => { if (el) fieldRefs.value[index] = el; }; const validateAll = () => { fieldRefs.value.forEach((inputEl, index) => { if (!inputEl.value) { console.error(`第${index + 1}个输入框未填写`); } }); }; return { fields, setFieldRef, validateAll }; } }; </script> ``` --- ### 关键注意事项 1. **访问时机**:确保在`onMounted`之后操作`ref`,否则可能获取到`null`[^2]。 2. **响应式更新**:动态`ref`数组需使用`ref([])`或`reactive({})`保持响应性。 3. **组件引用**:引用子组件时,通过`ref.value`可直接调用其暴露的方法或属性[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值