在官网 Vue3官网响应式监听示例 中,代码如下:
// src/components/UserRepositories.vue `setup` function
import { fetchUserRepositories } from '@/api/repositories'
import { ref, onMounted, watch, toRefs } from 'vue'
// 在我们组件中
setup (props) {
// 使用 `toRefs` 创建对 `props` 中的 `user` property 的响应式引用
const { user } = toRefs(props)
const repositories = ref([])
const getUserRepositories = async () => {
// 更新 `prop.user` 到 `user.value` 访问引用值
repositories.value = await fetchUserRepositories(user.value)
}
onMounted(getUserRepositories)
// 在 user prop 的响应式引用上设置一个侦听器
watch(user, getUserRepositories)
return {
repositories,
getUserRepositories
}
}
其中为什么不能直接监听 props.user
,即 watch(props.user, getUserRepositories)
,而需要 const { user } = toRefs(props)
这一步?
因为
watch
函数是用effect
函数实现的,为了能触发trigger
函数,必须是响应式数据,所以要走一遍toRefs
,应为你不能保证user一定是响应式的,他可能是一个字符串,是一个数字,为了代码能够在所有情况下都能正常工作,toRefs
是必要的推荐你看下《Vue设计与实现》 这本书,也感谢jsdeferred对我答案的完善😂