Skip to content
文章目录

forceUpdate使用场景

作用

迫使 Vue 实例重新渲染。注意它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件。

原理

js
Vue.prototype.$forceUpdate = function () {
  const vm: Component = this
  if (vm._watcher) {
    vm._watcher.update()
  }
}

实例需要重新渲染是在依赖发生变化的时候会通知 watcher,然后通知 watcher 来调用 update 方法,就是这么简单。

适用场景

  • 在 vue2 中,一些非规范操作下,对象和数组对应的视图绑定不会正确更新,可用到$forceUpdate 重新渲染视图来 更新页面视图,但是规范推荐的是使用 vue 的 set api,所以该用途不作为实际优雅场景,pass 掉这个用途。
  • 在 vue3 的 setup 中,视图绑定非响应式的引用类型,修改后正常是不会更新的,使用$forceUpdate后则会更新,但绑定的是非响应式基础类型数据,那$forceUpdate后也不会更新。不管是哪种使用情况,都完全不是 $forceUpdate 的合理应用场景,此处也 pass 掉这个用途。
  • vue3 中会触发beforeUpdateupdated的 2 个周期,但不触发renderTriggered,说明在 vue3 中,这对响应式数据的重新渲染并没任何帮助,并且 vue3 里不存在响应式数据更改后不会正确更新视图的情况了。所以这第三点的用途也 pass 掉
  • 主动触发beforeUpdateupdated的 2 个周期:使用$forceUpdate,会触发这 2 个生命周期。
  • Vue 总是知道何时更新 (如果你使用正确的话)。但是,在某些边缘情况下,你可能希望强制更新,尽管事实上没有任何响应式数据发生更改。 还有一些情况下,你可能希望防止不必要的后续更新(操作数据,但不更新后续对应视图内容,则不使用响应式数据;或者在有需要的时候,在合适的时机使用$forceUpdate更新这部分视图内容)。

参考资料

vue 源码解析:vue 生命周期方法$forceUpdate 方法的实现原理