ecomfe / spec

This repository contains the specifications.
4.62k stars 1.61k forks source link

关于"[强制]为非继承自PureComponent的纯组件实现shouldComponentUpdate方法" #45

Open errorrik opened 7 years ago

errorrik commented 7 years ago

我觉得这个貌似强制不太好?因为如果没有办法很方便的判断是否组件需要更新(比如不是immutable无法===),实现shouldComponentUpdate的成本并不低,而且性能收益也不高,不如不实现?

otakustay commented 7 years ago

事实上不用immutable的话react的表现是“未知行为”,因为一个组件是否被走到shouldComponentUpdate这一阶段是非常“不显而易见”的,比如你的任意一个父组件的shouldComponentUpdate返回了false,那么你就没机会判断,比如如果用connect和redux store连接后store的这个值没有变,你也没机会判断

因此,在组件的state上不使用immutable几乎可以肯定会遇到各种各样的坑,而我以为这边用immutable应该已经是常识,所以没有写进规范中

在immutable已经是常识的前提下,只会在2种情况下不继承PureComponent

  1. 需要比shallowEqual更高效的shouldComponentUpdate实现,这种情况下一定会实现shouldComponentUpdate所以没关系
  2. render并不是纯函数((state, prop) => vdom),这种组件事实上和不用immutable是一个道理的,应该避免

再综合上面2点,我认为基本上只会在“有自己更高效的shouldComponentUpdate实现”的情况下才会不继承PureComponent,也希望仅在这种情况下出现这种继承关系

errorrik commented 7 years ago

基于用immutable的假设下,这是没问题的。但是,我发现貌似很多产品线并未immutable,特别是未进行状态管理的产品,就是挨个挨个的component在写,这种我们是否需要在style guide中考虑

otakustay commented 7 years ago

有没有能作为参考的项目让我看一眼,我思考下这里怎么做取舍吧