vue3 原理关于 cleanupDepEffect 的疑问
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>reactive</title>
<script src="../packages/vue/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
<p>arr[0].v:{{arr[0].v}}</p>
<button @click="arr.shift()">删除第一个</button>
</div>
<script>
const { createApp, reactive, computed } = Vue
const app = createApp({
setup() {
const arr = reactive([{ v: 1 }, { v: 2 }])
return { arr }
},
}).mount('#app')
</script>
</body>
</html>
上面的示例,可以使代码执行到 cleanupDepEffect 内部,但我想问什么时候会出现 effect._trackId === trackId 的情况,而非 effect._trackId !== trackId。
function cleanupDepEffect(dep: Dep, effect: ReactiveEffect) {
const trackId = dep.get(effect)
if (trackId !== undefined && effect._trackId !== trackId) { // ←这里
dep.delete(effect)
if (dep.size === 0) {
dep.cleanup()
}
}
}