0%

toRef

toRef:

作用:创建一个ref对象,其value值指向另一个对象中的某个属性,可以用来为源响应式对象上的某个 property 新创建一个 ref。然后,ref 可以被传递,它会保持对其源 property 的响应式连接。

语法:const name=toRef(person,’name’)

应用:要将响应式对象中的某个属性单独提供给外部使用时

扩展:toRefs与toRef功能一致,但可以批量创建多个ref对象,语法:toRefs(person),将响应式对象转换为普通对象,其中结果对象的每个 property 都是指向原始对象相应 property 的 ref

1
2
3
4
5
6
7
8
9
10
11
12
const state = reactive({
foo: 1,
bar: 2
})

const fooRef = toRef(state, 'foo')

fooRef.value++
console.log(state.foo) // 2

state.foo++
console.log(fooRef.value) // 3

当你要将 prop 的 ref 传递给复合函数时,toRef 很有用:

1
2
3
4
5
export default {
setup(props) {
useSomeFeature(toRef(props, 'foo'))
}
}

即使源 property 不存在,toRef 也会返回一个可用的 ref。这使得它在使用可选 prop 时特别有用,可选 prop 并不会被 toRefs 处理。

toRefs

将响应式对象转换为普通对象,其中结果对象的每个 property 都是指向原始对象相应 property 的 ref

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const state = reactive({
foo: 1,
bar: 2
})

const stateAsRefs = toRefs(state)
/*
stateAsRefs 的类型:

{
foo: Ref<number>,
bar: Ref<number>
}
*/

// ref 和原始 property 已经“链接”起来了
state.foo++
console.log(stateAsRefs.foo.value) // 2

stateAsRefs.foo.value++
console.log(state.foo) // 3

当从组合式函数返回响应式对象时,toRefs 非常有用,这样消费组件就可以在不丢失响应性的情况下对返回的对象进行解构/展开:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function useFeatureX() {
const state = reactive({
foo: 1,
bar: 2
})

// 操作 state 的逻辑

// 返回时转换为ref
return toRefs(state)
}

export default {
setup() {
// 可以在不失去响应性的情况下解构
const { foo, bar } = useFeatureX()

return {
foo,
bar
}
}
}

toRefs 只会为源对象中包含的 property 生成 ref。如果要为特定的 property 创建 ref,则应当使用 toRef