const queryParams = ref({
pageSize: 10,
page: 1,
})
const tableData = shallowRef([])
const loading = ref(false)
const totalNum = ref(0)
function onSearch() {
loading.value = true
return InspectionServer.getInspectionTask(queryParams.value).then((res) => {
tableData.value = res.rows
loading.value = false
totalNum.value = res.total
})
}
watchEffect(onSearch)
为什么只有queryParams
变化的时候才会触发watchEffect
? watchEffect
依赖收集好像是通过访问属性来收集的,queryParams.value
访问了属性我理解,loading.value = true
不也访问了属性吗,在后面的then
函数里我改变了它的值,但是却不重新执行,虽然从业务逻辑的角度来看不重新执行是对的。
然后我测试了一下,在onSearch
里面添加了console.log(loading.value)
之后,就无限发送请求了。是不是赋值操作在watchEffect
里面不算访问属性,所以依赖没有收集?
新测试:在then
函数里添加console.log(loading.value)
不会无限触发,在loading.value = true
下面打印会无限触发。这个现象我的理解是then
函数里的属性watchEffect
收集的时候还没有执行,所以收集不到。
访问响应式属性就是读取值的时候,而
loading.value = true
这个属于属性赋值操作,就是get
和set
的区别。https://cn.vuejs.org/guide/essentials/watchers.html#watcheffect
没怎么用过Vue3,但是基本还是Vue响应式原理那一套,watchEffect的回调会立即执行,执行过程中访问到的响应式数据时会进行依赖收集,当响应式数据变化时会触发依赖更新,也就是watchEffect的回调。