1. React.PureComponentReact 15.3 版本添加的一个与 React.Component 同级的 API,适用于类组件;

  2. React.memoReact 16.6 版本新增的一个高阶函数 API,适用于函数组件;

  3. 这两个 API 本质上都是为了性能优化而生,通过使用这两个 API 可以减少页面不必要的重新渲染,提高页面性能;

纯组件概念

  1. React 中,纯组件 是指在其 props 和状态没有变化的情况下,组件的输出 (即渲染结果) 是恒定的;

  2. 换句话说,纯组件 的渲染过程只依赖于 propsstate 的值,当它们相同时,组件不会重新渲染;

  3. 这种行为使得 纯组件 在性能上具有优势,可以有效减少不必要的渲染,优化应用的性能;

纯组件特点

  1. 相同的输入产生相同的输出:对于相同的 propsstate,纯组件总是返回相同的渲染结果;

  2. 优化性能:通过实现浅比较,纯组件能够避免不必要的渲染,从而提升性能;

  3. 简化开发:纯组件使得组件变得更加可预测,降低了因状态和 props 变化引起的渲染复杂性;

纯组件工作原理

  1. 使用 PureComponentReact.memo 的组件会在组件的 shouldComponentUpdate 生命周期方法中自动执行 浅比较;这意味着,React 会比较当前的 propsstate 与下一个 propsstate 的值,如果它们相同,则不会重新渲染组件;

  2. 浅比较是指比较对象的引用,而不是深层比较对象的每个属性;这意味着,只有当 propsstate 的引用发生变化时,纯组件才会重新渲染;

手动实现 PureComponent

class MyPureComponent extends React.Component {
  shouldComponentUpdate(nextProps, nextState) {
    // 执行浅比较来决定是否更新组件
    // 注意:这只是一个简化的示例,实际的浅比较可能需要更复杂的逻辑来处理嵌套对象和数组
    const keys = Object.keys(this.props);
    const nextKeys = Object.keys(nextProps);

    if (keys.length !== nextKeys.length) return true; // 键的数量不同,必然需要更新
    for (let key of keys) {
      if (this.props[key] !== nextProps[key]) return true; // 如果值不同,返回 true 以更新组件
    }

    return false; // 所有键和值都相同,返回 false 以阻止更新
  }

  render() {
    // 组件的渲染逻辑...
  }
}

手动实现 React.memo

// 手动实现一个简单的React.memo
function memo(Component) {
    const cache = new Map();

    class MemoizedComponent extends React.PureComponent {
        render() {
            const propsKey = JSON.stringify(this.props);
            if (cache.has(propsKey)) {
                console.log('使用缓存的结果渲染组件');
                return cache.get(propsKey);
            } else {
                const renderedComponent = React.createElement(Component, this.props);
                cache.set(propsKey, renderedComponent);
                console.log('首次渲染组件,将结果存入缓存');
                return renderedComponent;
            }
        }
    }

    return MemoizedComponent;
}

// 使用示例
function MyComponent(props) {
    console.log('MyComponent渲染');
    return <div>{props.value}</div>;
}

const MemoizedMyComponent = memo(MyComponent);

// 渲染组件
ReactDOM.render(
    <div>
        <MemoizedMyComponent value="A" />
        <MemoizedMyComponent value="A" />
        <MemoizedMyComponent value="B" />
    </div>,
    document.getElementById('root')
);

纯组件的使用场景

  1. 大型应用:在大型 React 应用中,组件的性能至关重要,使用纯组件可以减少不必要的渲染,提升应用的响应速度和性能;

  2. 可预测的输出:如果组件的输出是根据 propsstate 计算得出的,且没有副作用,那么使用纯组件将使得组件变得更加可预测,便于测试和维护;

  3. 状态管理库的使用:在使用如 Redux 等状态管理库的应用中,组件往往会接收来自全局状态的 props,此时纯组件能够有效地避免因为状态的微小变化引起的频繁渲染;

纯组件的限制

  1. 不支持深比较:由于纯组件只执行浅比较,对于嵌套对象的变化,纯组件可能无法检测,这意味着,如果传递一个对象作为 props,而这个对象的属性发生了变化,但引用未变,纯组件不会重新渲染 (更新对象时返回一个新的对象即可)

  2. 组件的副作用:如果组件在渲染时会产生副作用,例如发起网络请求或修改 DOM,使用纯组件可能会导致不可预测的结果;

  3. 需要手动实现的优化:对于需要深比较或特定优化的组件,开发者可能仍需手动实现 shouldComponentUpdate 方法,而不是简单地使用 PureComponent

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 纯组件概念
  2. 2. 纯组件特点
  3. 3. 纯组件工作原理
    1. 3.1. 手动实现 PureComponent
    2. 3.2. 手动实现 React.memo
  4. 4. 纯组件的使用场景
  5. 5. 纯组件的限制