- 改变一组数据时,会触发同数量的 watcher更新。解决问题方法:异步更新,即所有数据改变完成后,watcher对应处理完成后,在用watcher一起更新视图
- watcher 调用 update方法,表示数据已经改变, 只是还没更新视图。
- 异步更新,需要异步队列的机制
- 机制: 1. 属性一个数组queue储存watcher, 2。queueWatcher方法,去重后数组 queue添加watcher,执行 nextTick(数组 queue添加watcher,都添加完成后, 在一起调用flushSchedulerQueue方法,执行数组queue次) 3. flushSchedulerQueue方法, 遍历数组queue并执行watcher的run方法, 执行一次后数组queue会清空, 以后在执行 也不会有影响
- nextTick 方法,callbacks数组 储存nextTick传进来的回调方法,1. callbacks数组的push ,通过 pending属性达到 只执行一次异步方法timerFunc
- 异步方法timerFunc 1. promise 实现 2. MutationObserver 主要是监听dom变化 也是一个异步方法 3. setImmediate 4. setTimeout
- nextTick 达到异步效果, 相当于 一堆watcher
callbacks.push(queueWatcher1.flushSchedulerQueue)
Promise.resolve().then(() => {
callbacks.forEach((item) => {
item()
})
})
callbacks.push(queueWatcher2.flushSchedulerQueue)
callbacks.push(queueWatcher3.flushSchedulerQueue)
callbacks.push(queueWatcher4.flushSchedulerQueue)
callbacks.push(queueWatcher5.flushSchedulerQueue)
一堆 push方法 + Promise.resolve().then()(加入微队列, 下一次队列循环会优先执行), 结果 push先执行完成后,Promise then 方法才执行,达到异步效果