前言
距离 vue3 发布已经两年多了,在 vue3 的使用过程中,我们经常会用到 ref 来声明变量,今天我们来聊一聊 ref 的用法。
过程
对比vue2
vue2 中通过使用 Object.defineProperty 来进行属性拦截,以达到响应式变量的效果,但是在 vue3 中,通过使用 Proxy 进行属性拦截。
用法一:响应式变量
vue2 中,我们通常在组件的 data() 中定义变量,这个变量就默认成为 响应式变量,但是 vue3 中引入了 setup 函数,在 setup 函数中,我们可以使用 ref 来定义响应式变量,代码如下:
const a = ref(1);
这个时候,我们打印 a,其实是一个被 Proxy 包裹的 1,也就跟我们对比 vue2 中的响应式处理达成一致,当我们在 JavaScript 中使用这个响应式变量,我们需要读取变量的 .value 来拿到数据:
console.log(a.value)
当我们在 template 中读取数据的时候,可以直接读取变量,而不需要 .value:
<div>{{ a }}</div>
用法二:子组件调用
vue2 中,我们可以通过给子组件绑定 ref 使得在父组件中修改子组件的 data 中定义的 变量,代码如下:
<!-- 父组件 -->
<div>
<child ref="childRef"></child>
</div>
<script>
export default {
mounted(){
this.$refs.childRef.getName()
}
}
<script>
<!-- 子组件 -->
<template>
<div>子组件</div>
</template>
<script>
export default {
method:{
getName(){
console.log("子组件")
}
}
}
</script>
在 vue3 中,我们仍然可以使用 ref 调用子组件的方法,但写法上略有差异:
<!-- 父组件 -->
<div>
<child ref="childRef"></child>
</div>
<script setup>
const childRef= ref(null);
childRef.value.getName();
</script>
<!-- 子组件 -->
<template>
<div>子组件</div>
</template>
<script setup>
const getName = () => {
console.log("子组件")
}
defineExpose({ getName })
</script>
其实最主要的区别在于:
vue2中可以通过this.$refs获取当前组件的所有子组件,并操作其对应方法,vue3中需要使用ref来进行定义,将定义的结果绑定给元素的ref属性,通过该变量来操作子组件的方法。vue2中凡是在子组件的methods中定义的方法都可以被调用,vue3中仅有子组件中通过defineExpose抛出来的方法可以被调用。
结语
我是一名前端程序员,但不止于前端,如果对我的文章有自己的见解,欢迎评论区讨论,大家一起学习,一起进步~,共同探索 vue3 更多的使用技巧。最后,再次感谢你能看到此处!