Vue 为什么没有 shouldComponentUpdate ?
据我所知Vue似乎只要在render函数中检查到数据依赖的变化都会重新渲染一次再去diff,而React在setState后重新渲染之前会有一次shouldComponentUpdate的检查来提高性能。为什么Vue不需要这一层钩子?
- vue 的机制,其实就是个依赖关系管理机制。不管是计算属性,watcher,以及 renderer,站在外部看,模型都是一样的,即初始化的时候通过一些方法分析出来这个模块依赖谁,等被依赖的数据更新了,这些模块就重新运算一遍产出物(实际上不尽然,比如计算属性有惰性机制)。
- 具体到 renderer,哪些数据的变更会引起dom变更,在模板编译的时候已经确定了,并且写死在生成的代码里了。而react是没有这种自动机制的,它去执行render唯一的原因就是你主动让他 render。那你什么时候让它render呢?
- 工程上一般是使用一个数据流工具,数据有变化的时候发出一个事件,一股脑把数据推过来,不区分哪个字段有变更(你区分了也没用,renderer根本不认)。如果这个数据流模型是多个组件共用的,那必然是在render之前有个hook给我们个机会告诉组件“这次没你的事儿”,有利于性能优化。那么,我们有没有可能不增加代码静态分析环节,搞清楚 react renderer 到底依赖哪些数据,继而把这个判断自动做掉呢?依我看不太可能,因为我们不能保证运行期跑一遍 render,它就会一次性访问它所有可能访问的数据。