Vue3中实现数据响应式,用到的是组合式API中的ref和reactive函数,不同的是ref函数一般定义基本类型数据,而reactive函数用于定义一个对象类型的响应式数据。
ref和reactive区别:
如果在template里使用的是ref类型的数据, 那么Vue会自动帮我们添加.value
如果在template里使用的是reactive类型的数据, 那么Vue不会自动帮我们添加.value
Vue是如何决定是否需要自动添加.value的
Vue在解析数据之前, 会自动判断这个数据是否是ref类型的,
如果是就自动添加.value, 如果不是就不自动添加.value
Vue是如何判断当前的数据是否是ref类型的
通过当前数据的__v_ref来判断的
如果有这个私有的属性, 并且取值为true, 那么就代表是一个ref类型的数据
ref即可以定义基本类型、也可以定义对象类型。
template中取值时,会自动添加.value
<template>
<div @click="changeData ">{{msg}}</div>
</template>
<script setup>
import { ref,reactive } from "vue";
let msg = ref('hello world')
let obj = ref({
name:'juejin',
age:3
})
const changeData = () => {
msg.value = 'hello juejin'
obj.value.name = 'hello world'
}
</script>
reactive只能定义对象类型。定义基本数据类型不起作用
取值时不需要加.value
<template>
<div @click="changeData ">{{obj.name}}</div>
</template>
<script setup>
import { reactive } from "vue";
let obj = reactive({
name:'juejin',
age:3
})
const changeData = () => {
obj.name = 'hello world'
}
</script>
ref定义对象,在js中使用时都应该.value,如果定义的对象嵌套太深,再多一层.value太冗余,而reactive则无需.value;
ref定义对象类型数据,里边使用的也是reactive中的Proxy代理,不如直接使用reactive;
reactive不能直接定义基本类型数据,不起作用,可以将基本类型数据整体放入一个对象中,将reactive当作Vue2中的data去使用。