vue 在for循环中设置ref并获取$refs

一、单循环动态设置ref

1.设置:【:ref="'XXX' + index"】XXX -->自定义ref的名字

2.获取:let ref = eval('this.$refs.XXX' + index)0

3.示例:

代码如下所示

javascript 复制代码
<template>
    <div class="ref_test">
        <div v-for="(item, index) in dataList" :key="index" :ref="'refName' + index" @click="clickGetRef(index)">
            <p>{{ item.title }}</p>
        </div>
    </div>
</template>

<script>
export default {
    data() {
        return {
            dataList: [
                {
                    "id": 1,
                    "title": "这是来测试如何获取动态ref的"
                },
                {
                    "id": 2,
                    "title": "第2条数据"
                },
                {
                    "id": 3,
                    "title": "第3条数据"
                },
                {
                    "id": 4,
                    "title": "第4条数据"
                },
            
            ]
        }
    },
    methods: {
        clickGetRef(index) {
            let ref = eval('this.$refs.refName' + index)[0]
            console.log(ref);
        }
    },
}
</script>

<style></style>

二、双循环动态设置ref

1.设置:【:ref="'XXX' + (index+i)"】或者【:ref="'XXX' + id"】

index+i -->两个for循环的索引;

id -->item的唯一标识;

2.获取:

bash 复制代码
let ref = eval('this.$refs.XXX' + (index + i))[0]
或者
let ref = eval('this.$refs.XXX' + (item.id))[0]

3.示例:

代码如下所示

javascript 复制代码
<template>
    <div>
        <div class="ref_double_test">
            <div v-for="(item, index) in dataLists" :key="index">
                <div class="content" v-for="(sonItem, i) in item.sonList" :key="index + i" @click="clickGetDoubleRef(index, i, sonItem)">
                    <!-- 方式一:用索引的方式,用一个索引可能会重复,为防止重复,则用两个索引【index + i】 -->
                    <div :ref="'refName1' + (index + i)">{{ item.title }}</div> ----
                    <!-- 方式二:用id的方式 -->
                    <div :ref="'refName2' + sonItem.sonId">{{ sonItem.sonContent }}</div>
                </div>
            </div>
        </div>
    </div>
</template>

<script>
export default {
    data() {
        return {
            dataLists: [
                {
                    "id": 1,
                    "title": "第1条数据",
                    "sonList": [
                        { "sonId": 1, "sonContent": "子集第1条数据" },
                        { "sonId": 2, "sonContent": "子集第2条数据" },
                    ]
                },
                {
                    "id": 2,
                    "title": "第2条数据",
                    "sonList": [
                        { "sonId": 11, "sonContent": "子集第11条数据" },
                        { "sonId": 22, "sonContent": "子集第22条数据" },
                    ]
                },
                {
                    "id": 3,
                    "title": "第3条数据",
                    "sonList": [
                        { "sonId": 111, "sonContent": "子集第111条数据" },
                        { "sonId": 222, "sonContent": "子集第222条数据" },
                    ]
                }
            ]
        }
    },
    methods: {
        clickGetDoubleRef(index, i, sonItem) {
            // 方式一
            let ref1 = eval('this.$refs.refName1' + (index + i))[0]
            console.log('ref1', ref1);

            // 方式二
            let ref2 = eval('this.$refs.refName2' + sonItem.sonId)[0]
            console.log('ref2', ref2);
        }
    },
}
</script>

<style>
.ref_test {
    width: 500px;
    height: 100px;
    border: 1px solid gray;
}
.content {
    width: 500px;
    height: 30px;
    display: flex;
    background: rebeccapurple;
    margin-bottom: 10px;
}
</style>
相关推荐
卸任11 小时前
Vibe coding工具使用心得
前端·ai编程
brien912 小时前
为什么模型标称 1M,Google Antigravity 聊到 256K 却突然失忆?我们给它做了个原生行内监控圆环
前端
修炼的dance12 小时前
录屏关键帧间隔多少合适?六档实测,2秒到10秒小了75.6%
前端
Lank_M12 小时前
关键帧从1秒拉到10秒,录屏小87.3%,摄像头小10.8%
前端
补码缩写12 小时前
用 ffprobe 拆录屏,八成字节在 29 个关键帧上
前端
百思不得小李12 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
陈随易12 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
清晨Coding12 小时前
删了 Cookie 还能自动登录?Google系网站登录态自动恢复的原理分析
javascript
风骏时光牛马12 小时前
前沿视界
前端
kyriewen13 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员