shouldComponentUpdate检查

合理的实现shouldComponentUpdate能够避免不必要的重新渲染.

React会在props和state发生改变的时候重新渲染组件.
试想一下当每次有props和state发生改变时(可能只是一个很小的用户动作), 整个页面都会重新渲染一次, 这从性能上来说肯定不能令人满意. 这就是shouldComponentUpdate这个生命周期函数发挥作用的时候了. 当React想要重新渲染组件时, React会检查shouldComponentUpdate这个函数是返回true还是false(这将决定组件是否更新.)React默认这个函数是返回true的,意味着无论state还是props发生变化, 组件都将被更新). 所以对于那些不需要变化的组件, 我们可以直接返回false来阻止组件更新,以此提升性能. 但更多的时候, 我们需要在这个函数内写自己的逻辑来判断组件是否需要更新.

坏实践

  1. const AutocompleteItem = (props) => {
  2. const selectedClass = props.selected === true ? "selected" : "";
  3. var path = parseUri(props.url).path;
  4. path = path.length <= 0 ? props.url : "..." + path;
  5. return (
  6. <li
  7. onMouseLeave={props.onMouseLeave}
  8. className={selectedClass}>
  9. <i className="ion-ios-eye"
  10. data-image={props.image}
  11. data-url={props.url}
  12. data-title={props.title}
  13. onClick={props.handlePlanetViewClick}/>
  14. <span
  15. onMouseEnter={props.onMouseEnter}
  16. >
  17. <div className="dot bg-mint"/>
  18. {path}
  19. </span>
  20. </li>
  21. );
  22. };

好实践

  1. export default class AutocompleteItem extends React.Component {
  2. shouldComponentUpdate(nextProps, nextState) {
  3. if (
  4. nextProps.url !== this.props.url ||
  5. nextProps.selected !== this.props.selected
  6. ) {
  7. return true;
  8. }
  9. return false;
  10. }
  11. render() {
  12. const {props} = this;
  13. const selectedClass = props.selected === true ? "selected" : "";
  14. var path = parseUri(props.url).path;
  15. path = path.length <= 0 ? props.url : "..." + path;
  16. return (
  17. <li
  18. onMouseLeave={props.onMouseLeave}
  19. className={selectedClass}>
  20. <i className="ion-ios-eye"
  21. data-image={props.image}
  22. data-url={props.url}
  23. data-title={props.title}
  24. onClick={props.handlePlanetViewClick}/>
  25. <span
  26. onMouseEnter={props.onMouseEnter}>
  27. <div className="dot bg-mint"/>
  28. {path}
  29. </span>
  30. </li>
  31. );
  32. }
  33. }

参考资料: