React 无状态组件 - 性能和 PureRender

IT技术 javascript performance reactjs ecmascript-6 stateless
2021-05-04 09:20:00

每个人都说它使用stateless组件会提高应用程序的性能。然而,我注意到在错误的地方使用无状态组件确实会降低应用程序的性能。

发生这种情况是因为无状态组件始终呈现,即使属性没有改变

在的情况下,stateful我们可以使用的部件PureComponentPureRenderMixin或实现自己的shouldComponentUpdate-感谢它发现一个大的增长相比,无状态的组件时,应用程序的性能。

我想问一下是否有某种方法可以实现诸如pureRender无状态组件之东西我对在有状态组件中包装无状态组件不感兴趣。

如果这是不可能的,所以它是如何真正与性能stateless组件?

我准备了两个简单的例子,展示了我写的内容。尝试更改活动按钮:

有状态的 PureComponent:

class List extends React.Component{
  constructor(props) {
    super(props);
    this.generateElements = this.generateElements.bind(this);
    this.changeActive = this.changeActive.bind(this);
    this.state = {
    	active: 0
    }
  }
	generateElements(){
  	let elements = [];
    for(let i = 0; i<=1000; i++){
    	elements.push(<Element key={i} 
      											 index={i}
                             active={this.state.active === i} 
                             changeActive={this.changeActive} /> )
    }
    return elements;
  }
  changeActive(index){
  	this.setState({
    	active: index
    });
  }
  render() {
    return (
    	<div>
        <div className="classButtons">
          {this.generateElements()}
        </div>
      </div>
    )
  }
}

class Element extends React.PureComponent{
  render() {
  console.log('render');
    return(
      <button onClick={this.props.changeActive.bind(null, this.props.index)}
      		    className={this.props.active ? 'active' : null} >
      	Element {this.props.index}
      </button>
    )

  }
}

ReactDOM.render(<List />, document.getElementById('container'));
button{
  display: block;
  margin-bottom: 2px;
}
button.active{
  background-color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react-dom.js"></script>

<div id="container"></div>

无状态组件:

class List extends React.Component{
  constructor(props) {
    super(props);
    this.generateElements = this.generateElements.bind(this);
    this.changeActive = this.changeActive.bind(this);
    this.state = {
    	active: 0
    }
  }
	generateElements(){
  	let elements = [];
    for(let i = 0; i<=1000; i++){
    	elements.push(<Element key={i} 
      											 index={i}
                             active={this.state.active === i} 
                             changeActive={this.changeActive} /> )
    }
    return elements;
  }
  changeActive(index){
  	this.setState({
    	active: index
    });
  }
  render() {
    return (
    	<div>
        <div className="classButtons">
          {this.generateElements()}
        </div>
      </div>
    )
  }
}

const Element = ({changeActive, index, active}) => {
	console.log('render');
  return(
    <button onClick={changeActive.bind(null, index)}
            className={active ? 'active' : null} >
            Element {index}
    </button>
  )
}

ReactDOM.render(<List />, document.getElementById('container'));
button{
  display: block;
  margin-bottom: 2px;
}
button.active{
  background-color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react-dom.js"></script>

<div id="container"></div>

1个回答

然而,我注意到在错误的地方使用无状态组件确实会降低应用程序的性能。

的确。对于复杂的组件,你应该避免无状态的组件。

每个人都说它使用无状态组件会提高应用程序性能

你错过了一个重要的部分......在 Future 中

我想问一下是否有某种方法可以为无状态组件实现像 pureRender 这样的东西?

还没有。

如果这是不可能的,那么无状态组件的性能究竟如何?

实现的组件性能shouldComponentUpdate会更好。


这里由团队做出react支持我的陈述。那里的两个重要引述

对于复杂的组件,定义 shouldComponentUpdate(例如纯渲染)通常会超过无状态组件的性能优势。

丹·阿布拉莫夫

目前没有对函数进行特殊优化,但我们可能会在未来添加此类优化。但就目前而言,它们的表现与课堂完全一样。