Contents
Tags

一、toRefs() 将响应式对象的所有属性都转换为 ref,并返回一个包含这些 ref 的对象

  • 基本使用
1const state = reactive({
2  foo: 1,
3  bar: 2
4})
5
6const stateAsRefs = toRefs(state)
7
8// The ref is ‘linked’ to the source property.
9state.foo++
10console.log(stateAsRefs.foo.value) // 2
11
12stateAsRefs.foo.value++
13console.log(state.foo) // 3

 

  • 实现原理 (packages/reactivity/src/ref.ts)

toRefs 函数通过遍历传入的响应式对象,将每个属性转换为 ref,从而允许我们在使用 ref 的地方访问和修改原始对象的属性

这些 ref 保持与原始对象属性的响应式连接,使得在修改 ref 的值时,原始对象的属性值也会随之更新,反之亦然

1/**
2 * Converts a reactive object to a plain object where each property of the
3 * resulting object is a ref pointing to the corresponding property of the
4 * original object. Each individual ref is created using {@link toRef()}.
5 *
6 * @param object - Reactive object to be made into an object of linked refs.
7 * @see {@link https://vuejs.org/api/reactivity-utilities.html#torefs}
8 */
9export function toRefs<T extends object>(object: T): ToRefs<T> {
10  if (__DEV__ && !isProxy(object)) {
11    warn(`toRefs() expects a reactive object but received a plain one.`)
12  }
13  const ret: any = isArray(object) ? new Array(object.length) : {}
14  for (const key in object) {
15    ret[key] = propertyToRef(object, key)
16  }
17  return ret
18}

 

二、toRef() 和 toRefs() 的区别

toRef: 用于单个属性,将响应式对象的某个属性转换为 ref

toRefs: 用于整个对象,将响应式对象的所有属性都转换为 ref,并返回一个包含这些 ref 的对象

 

三、其他

学习的记录,仅供参考