• shouldComponentUpdate检查
    • 坏实践
    • 好实践
  • 参考资料:

    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. }

    参考资料:

    • @nesbtesh/react-performance-optimization-28ec5b61fff3">React Performance optimization
    • React rendering misconception