forceUpdate使用场景
作用
迫使 Vue 实例重新渲染。注意它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件。
原理
js
Vue.prototype.$forceUpdate = function () {
const vm: Component = this
if (vm._watcher) {
vm._watcher.update()
}
}
实例需要重新渲染是在依赖发生变化的时候会通知 watcher,然后通知 watcher 来调用 update 方法,就是这么简单。
适用场景
- 在 vue2 中,一些非规范操作下,对象和数组对应的视图绑定不会正确更新,可用到
$forceUpdate重新渲染视图来 更新页面视图,但是规范推荐的是使用 vue 的setapi,所以该用途不作为实际优雅场景,pass 掉这个用途。 - 在 vue3 的 setup 中,视图绑定非响应式的引用类型,修改后正常是不会更新的,使用
$forceUpdate后则会更新,但绑定的是非响应式基础类型数据,那$forceUpdate后也不会更新。不管是哪种使用情况,都完全不是$forceUpdate的合理应用场景,此处也 pass 掉这个用途。
- vue3 中会触发
beforeUpdate和updated的 2 个周期,但不触发renderTriggered,说明在 vue3 中,这对响应式数据的重新渲染并没任何帮助,并且 vue3 里不存在响应式数据更改后不会正确更新视图的情况了。所以这第三点的用途也 pass 掉 - 主动触发
beforeUpdate和updated的 2 个周期:使用$forceUpdate,会触发这 2 个生命周期。 - Vue 总是知道何时更新 (如果你使用正确的话)。但是,在某些边缘情况下,你可能希望强制更新,尽管事实上没有任何响应式数据发生更改。 还有一些情况下,你可能希望防止不必要的后续更新(操作数据,但不更新后续对应视图内容,则不使用响应式数据;或者在有需要的时候,在合适的时机使用
$forceUpdate更新这部分视图内容)。