vue3 watch中赋值的ref数组数据不是响应式?
export function useRoomUsers(roomId) {
let executorList = ref([])
RoomApi.findRoomUsers({roomId}).then(res => {
executorList.value = res.data;
})
return { executorList }
}
// const { executorList } = useRoomUsers(11)
// console.log('executorList', executorList)
let executorList = ref([])
watch(() => searchForm.roomId, (val) => {
if (val) {
executorList.value = useRoomUsers(val).executorList
console.log('executorList', executorList)
}
})
return { executorList }
useRoomUsers是一个异步获取数据方法返回ref对象,用解构方式获取的数据是可以正常响应的。但业务需要放在watch当中就不行了。试过把返回的地方改成reactive 直接这边数组都是空的,理解不了,求大神指点。
就很奇怪获取value是空的,但打印出来数组是有数据的
回复
1个回答

test
2024-07-15
export function useRoomUsers(roomId) {
let executorList = ref([])
function doFetch() {
executorList.value = []
if (unref(roomId)) {
RoomApi.findRoomUsers({roomId: unref(roomId)}).then(res => {
executorList.value = res.data;
})
}
}
if (isRef(roomId)) {
// 若输入的 URL 是一个 ref,那么启动一个响应式的请求
watchEffect(doFetch)
} else {
// 否则只请求一次
doFetch()
}
return { executorList }
}
const roomId = computed(() => {
return searchForm.value.roomId
})
const { executorList } = useRoomUsers(roomId)
改成这样可以了,之前直接用的searchForm.value.roomId不会触发watchEffect,后面的判断也得用unref解包。说实话还是疑惑除了解构方式 直接value赋值为啥不行。
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容