提问者:小点点

具有shouldComponentUpdate的组件与无状态组件。表演


我知道无状态组件更易于使用(在特定场景中),但由于您不能使用shouldComponentUpdate,这难道不意味着组件将在每次道具更改时重新渲染吗?。我的问题是,使用带有smart shouldComponentUpdate的类组件是否比使用无状态组件更好(性能方面)。

就性能而言,无状态组件是更好的解决方案吗?考虑一下这个愚蠢的例子:

const Hello =(props) =>(
       <div>
           <div> {props.hello}</div>
           <div>{props.bye}</div>
       </div>);

vs

class Hello extends Component{
    shouldComponentUpdate(nextProps){
        return nextProps.hello !== this.props.hello
    };
    render() {
        const {hello, bye} = this.props;
        return (
            <div>
               <div> {hello}</div>
               <div>{bye}</div>
           </div>
        );
    }
}

假设这些组件都有两个道具,并且只有一个我们想要跟踪和更新的道具(这是一个常见的用例),使用无状态功能组件还是类组件更好?

使现代化

在做了一些研究之后,我同意这个有标记的答案。虽然类组件(使用shouldComponentUpdate)的性能更好,但对于简单组件来说,改进似乎微不足道。我的看法是:

  • 对于复杂的组件,使用由PureComponent或Component扩展的类(取决于您是否要实现自己的应该组件更新)
  • 对于简单的组件使用功能组件,即使这意味着重新渲染运行
  • 尝试从最接近的类基组件中削减更新量,以使树尽可能静态(如果需要)

共1个答案

匿名用户

我认为您应该阅读无状态功能组件,并且应该更新组件

对于复杂的组件,定义应该组件更新(如纯渲染)通常会超过无状态组件的性能优势。文档中的句子暗示了我们计划的一些未来优化,这样我们就不会为无状态函数组件分配内部实例(我们只调用函数)。我们也可能不会一直拿着道具等。微小的优化。我们不讨论文档中的细节,因为优化还没有真正实现(无状态组件为这些优化打开了大门)。

https://github.com/facebook/react/issues/5677#issuecomment-165125151

目前没有针对函数的特殊优化,尽管我们将来可能会添加此类优化。但就目前而言,它们的性能与类完全相同。

https://github.com/facebook/react/issues/5677#issuecomment-241190513

我也建议检查一下https://medium.com/missive-app/45-faster-react-functional-components-now-3509a668e69f

为了衡量变化,我创建了这个基准,结果非常惊人!从仅仅将基于类的组件转换为功能组件,我们可以获得6%的加速。但通过将其称为一个简单函数而不是挂载,我们得到了~45﹪ 总速度提高。

回答这个问题:视情况而定。如果您有复杂/沉重的组件,您可能应该实现shouldComponentUpdate。否则,使用常规函数就可以了。我认为实现不应该让组件更新对于像您这样的组件Hello不会有很大的不同,它可能不值得花时间实现。还应该考虑从<代码> PURE组件>代码>而不是<代码>组件< /代码>。