这次我们继续总结Composition API里的其它内容。
unref()
如果参数是一个ref则返回它的value,否则返回参数本身。它是val = isRef(val) ? val.value : val 的语法糖。
isref()
检查一个值是否为一个ref对象
toRefs()
把一个响应式对象转换成普通对象,该普通对象的每个 property 都是一个 ref ,和响应式对象 property 一一对应。并且,当想要从一个组合逻辑函数中返回响应式对象时,用 toRefs 是很有效的,该 API 让消费组件可以 解构 / 扩展(使用 ... 操作符)返回的对象,并不会丢失响应性:
<template>
<div>
<p>count: {{count}}</p>
<button @click="increment">+1</button>
</div>
</template>
<script>
import { reactive, toRefs } from '@vue/composition-api'
export default {
setup() {
const state = reactive({
count: 0
})
const increment = () => {
state.count++
}
return {
...toRefs(state), // 解构出来不丢失响应性
increment
}
}
}
</script>
computed()
computed() 用来创建计算属性,computed() 函数的返回值是一个 ref 的实例。这个值模式是只读的:
import { ref, computed } from '@vue/composition-api'
export default {
setup() {
const count = ref(0)
const plusOne = computed(() => count.value + 1)
plusOne.value = 10
console.log('plusOne.value: ', plusOne.value)
console.log('count.value: ', count.value)
}
}
// 打印结果:
// [Vue warn]: Computed property was assigned to but it has no setter.
// plusOne.value: 1
// count.value: 0
或者传入一个拥有get和set 函数的对象,创建一个可手动修改的计算状态:
import { ref, computed } from '@vue/composition-api'
export default {
setup() {
const count = ref(0)
const plusOne = computed({
get: () => count.value + 1,
set: val => {
count.value = val - 1
}
})
plusOne.value = 10
console.log('plusOne.value: ', plusOne.value)
console.log('count.value: ', count.value)
}
}
// 打印结果:
// plusOne.value: 10
// count.value: 9
watchEffect()
watchEffect() 监测副作用函数。立即执行传入的一个函数,并响应式追踪其依赖,并在其依赖变更时重新运行该函数:
<template>
<div>
<p>count: {{count}}</p>
<button @click="increment">+1</button>
</div>
</template>
<script>
import { ref, watchEffect } from '@vue/composition-api'
export default {
setup() {
// 监视 ref 数据源
const count = ref(0)
// 监视依赖有变化,立刻执行
watchEffect(() => {
console.log('count.value: ', count.value)
})
const increment = () => {
count.value++
}
return {
count,
increment
}
}
}
</script>
停止侦听。当 watchEffect 在组件的 setup() 函数或生命周期钩子被调用时, 侦听器会被链接到该组件的生命周期,并在组件卸载时自动停止。
在一些情况下(比如超时就无需继续监听变化),也可以显式调用返回值以停止侦听:
<template>
<div>
<p>count: {{state.count}}</p>
<button @click="increment">+1</button>
</div>
</template>
<script>
import { reactive, watchEffect } from '@vue/composition-api'
export default {
setup() {
// 监视 reactive 数据源
const state = reactive({
count: 0
})
const stop = watchEffect(() => {
console.log('state.count: ', state.count)
})
setTimeout(() => {
stop()
}, 3000)
const increment = () => {
state.count++
}
return {
state,
increment
}
}
}
// 3秒后,点击+1按钮不再打印
</script>