vue2 与 vue3 $refs使用区别

本文详细介绍了Vue2和Vue3中$refs的使用差异,包括组件引用、动态赋值和操作router-view的方法。在Vue2中,$refs可以直接获取并操作组件,而在Vue3中,引用需要通过ref()函数创建,并且不能直接修改。对于router-view,Vue2可以直接调用其上的方法,Vue3则需要通过v-slot和组件实例来实现。
摘要由CSDN通过智能技术生成

vue2与vue3 $refs使用区别

vue2

  • 操作组件
<template>
	<div>
        <element ref="element">按钮</element>
        <element id="element2">按钮</element>
    </div>
</template>
  • 获取
console.log(this.$refs.element)
  • 使用 (自定义组件)
// this.$refs.element.属性/函数...
  • 动态赋值
this.$refs.element2 = document.getElementById('element2')
  • 操作router-view

这种操作可能不太规范,但vue2确实是可以的

<!--
	这里假如 router-view 渲染初的组件携带test函数
-->
<template>
<div id="app">
    <router-view ref="view"></router-view>
    <button @click="callElement">调用组件函数</button>
    </div>
</template>
<script>
    export default {
        data() {
            return {};
        },
        methods: {
            callElement() {
                this.$nextTick(()=>{
					this.$refs.view.test()
				})
            },
        },
    };
</script>

vue3

<template>
    <element ref="element">按钮</element>
    <element id="element2">按钮</element>
</template>
  • 引入
import { onMounted, ref } from "vue";
  • 获取
setup(){
    const element = ref(null);
    onMounted(()=>{
        console.log(element)
    })
    return {
        element
    }
}
  • 获取多个
<template>
<element v-for="(item, index) in 10" :key="index" :ref="getRefElements" id="element2">按钮</element>
</template>
<script>
    export default {
        setup(){
            const refElements = ref([]);
            const getRefElements = (e) => {
                refs.value.push(e);
            };
            onMounted(() => {
                console.log(refElements);
            });
            return {
                getRefElements,
            };
        }        
    }

</script>
  • 使用(自定义组件)
setup(){
    const element = ref(null);
    onMounted(()=>{
        // element.value.属性/函数...
    })
    return {
        element
    }
}
  • 动态赋值
// setup中我们不能直接修改 ref(null) 所获取的值
// 尝试在mounted使用 this.$refs修改
 mounted() {
     console.log(this.$refs.element)// Proxy代理,可以直接调用组件数据和函数
     // this.$refs.hello = document.getElementById("element2"); // 不可以直接修改
     // vue3.0中暴露了this.$里有refs,这里可以动态修改
     this.$.res.hello = document.getElementById("element2");
 },
  • 操作router-view
<!--
	这里假如 router-view 渲染初的组件携带test函数
-->
<template>
  <router-view v-slot="{ Component }">
    <component  ref="view" :is="Component" />
  </router-view>
  <button @click="callElement">调用组件函数</button>
</template>
<script>
    export default {
        data() {
            return {};
        },
        methods: {
            callElement() {
              this.$nextTick(()=>{
              	 this.$refs.view.test()
              })
            },
        },
    };
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tommyrunner

你的支持,就是我的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值