ref
在 setup() 可创建一个静态的数据,如 const count = 0;
而使用 ref 可以接受一个内部值,返回一个响应式且可变的 ref 对象
ref 对象具有指向内部单个 property: .value
import { ref } from 'vue';
// 响应式返回一个 "RefImpl" 的 ref 对象,值存储在内部 .value 属性上,且可变
const count = ref(0);
count increment = () => {
count.value ++;
}
这是解决 reactive 不支持原始值数据,ref 支持 string、number、boolean 原始值数据,同时也能作用于对象。
const obj = ref({
name: 'Mr.Lee',
age: 100
});
// obj.value 下返回还是 reactive 的 proxy, obj 本身还是 RefImpl
console.log(obj.value);
console.log(obj.value.name);
在 setup() 返回时,不需要显式指明 .value
, Vue 会自动解开
return {
count,
}
isRef
unref
如果参数是一个 ref,则返回内部值,否则返回参数本身 val = isRef(val) ? val.value : val
的语法糖
如果不是知道是 ref 对象与否,使用 unref 一定是解包的对象或值
toRef
可以将源响应式对象的 property 创建一个 ref 对象,
toRef 是引用操作,当修改数据时,原数据也会被修改
const obj = reactive({
name: 'Mr.Lee',
age: 100
});
const ageRef = toRef(obj, 'age'); // 返回响应的 ref 对象引用
ageRef.value++
console.log(obj.age) // 101
state.foo++
console.log(ageRef.value) // 102
可以用来为源响应式对象上的某个 property 新创建一个 ref。然后,ref 可以被传递,它会保持对其源 property 的响应式连接。
toRefs
与 toRef 相似,但对象内所有 property 都会是 ref 对象
customRef
自定义 ref,并对其依赖项跟踪和更新触发进行显式控制。
需要一个工厂函数 function(track, trigger) {}
- track() 和 trigger() 函数
- 返回带有 get 和 set 的对象
function useDebouncedRef(value, delay = 200) {
let timeout;
return customRef((track, trigger) => {
return {
get() {
track();
return value;
},
set(newValue) {
clearTimeout(timeout);
timeout = setTimeout(() => {
value = newValue;
trigger();
}, delay)
}
}
})
}
shallowRef
创建一个只跟踪自身 .value 变化的 ref, 但 value 不会变成 reactive。即如果是用 ref,value 是对象时会转为 reactive 对象。而 shallowRef 就不会const foo = shallowRef({})
// 改变 ref 的值是响应式的
foo.value = {}
// 但是这个值不会被转换。
isReactive(foo.value) // false
triggerRef
手动触发与shallowRef
关联的任何副作用 ```vue {{ foo }}
```