Vue响应式数据之基本数据类型
学过 js 的应该都知道,基本数据类型并非引用类型,直接修改是无法直接拦截的
let str = 'vue'
// 无法拦截str
str = 'vue3'
很容易想到,用非原始值“包裹”原始值,成一个对象的形式,然后对包裹对象 wrapper 进行 proxy 拦截
const wrapper = {
value: 'vue',
}
const name = reactive(wrapper)
name.value = 'vue3'
不出意外(肯定不会出),将会输出
SET value vue3
不难发现,vue2 中对原始值的响应都是将其包裹在 data 函数下返回的对象,并且从上面的代码上来看。但从开发者的角度还需要创建一个包装对象,不易操作的同时,也意味不规范。于是 vue3 封装了 ref 函数,而返回的对象便是响应式的包装对象reactive(wrapper)
function ref(val) {
const wrapper = {
value: val,
}
return reactive(wrapper)
}
上面的代码便改写为
const name = ref('vue')
name.value = 'vue3'
区别是否为 ref
要区别一个数据是否为 ref,只需要在 ref 中定义一个不可枚举的属性__v_isRef
值为 true。
function ref(val) {
const wrapper = {
value: val,
}
Object.defineProperty(wrapper, '__v_isRef', {
value: true,
})
return reactive(wrapper)
}