当前位置: 首页 > article >正文

在 React 中避免不必要的重新渲染

构建高性能 React 应用程序的关键之一是避免不必要的重新渲染。React 的渲染引擎是高效的,但防止在不需要的地方重新渲染仍然至关重要。在这篇文章中,我们将介绍常见错误以及如何避免它们。

1. 使用 React.memo 缓存组件

React.memo 帮助你在组件的 props 没有改变时跳过重新渲染。但是,如果不实现自定义比较函数,很容易滥用 React.memo

不正确的用法:

const MemoizedComponent = React.memo(MyComponent);

这只检查 props 引用是否发生了变化,这可能并不总是足够的。

正确用法:

const MemoizedComponent = React.memo(MyComponent, (prevProps, nextProps) => {
  return prevProps.itemId === nextProps.itemId;
});

在这里,我们使用了一个自定义的比较函数,它只在 itemId prop 发生变化时触发重新渲染。

2. 避免过度使用内联函数

在 JSX 中使用内联函数可能会导致不必要的重新渲染,因为 React 在每次渲染时都会将新函数视为新 prop。

不正确的用法:

function ButtonComponent() {
  return <button onClick={() => handleClick()}>Click me</button>;
}

这会导致在每次渲染时重新创建 handleClick,从而导致不必要的重新渲染。

正确用法:

import { useCallback } from 'react';

function ButtonComponent() {
  const handleClick = useCallback(() => {
    // Handle click logic
  }, []);

  return <button onClick={handleClick}>Click me</button>;
}

通过使用 useCallback,我们记住了 handleClick 函数,防止了每次渲染时不必要的重新创建。

3. 利用 PureComponent

当使用类组件时,使用 React.PureComponent 可以确保组件仅在其 props 或 state 发生变化时重新渲染。如果你使用的是 React.Component,可能会导致不必要的重新渲染。

不正确的用法:

class CardComponent extends React.Component {
  // Component logic
}

正确用法:

class CardComponent extends React.PureComponent {
  // Component logic
}

通过扩展 React.PureComponent 将浅层比较 props 和 state,避免不必要的重新渲染。

4. 优化功能组件中的 useSelector

当从 react-redux 使用 useSelector 时,只选择必要的 state 切片很重要。

不正确的用法:

import { useSelector } from 'react-redux';

const DataComponent = () => {
  const globalState = useSelector((state) => state);
  // Render logic
};

这将导致组件在状态的任何部分发生变化时重新渲染。

正确用法:

import { useSelector } from 'react-redux';

const DataComponent = () => {
  const selectedData = useSelector((state) => state.specificSlice);
  // Render logic based on specific slice
};

通过仅选择状态的必要部分,可以最大限度地减少重新渲染。

5. 在类组件中实现 shouldComponentUpdate

对于不扩展 PureComponent 的类组件,手动实现 shouldComponentUpdate 可以更精细地控制组件何时重新渲染。

不正确的用法:

class ListItem extends React.Component {
  // Component logic
}

这将在每次父组件渲染时重新渲染,即使 props 和 state 没有改变。

正确用法:

class ListItem extends React.Component {
  shouldComponentUpdate(nextProps, nextState) {
    return this.props.itemId !== nextProps.itemId || this.state.value !== nextState.value;
  }

  // Component logic
}

通过自定义 shouldComponentUpdate,我们确保组件仅在 itemId prop 或 value 状态发生变化时重新渲染。


http://www.kler.cn/news/342128.html

相关文章:

  • slam系列1:open3d入门笔记
  • 蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555
  • Android实现ViewPager剧中放大效果
  • QA对(question-answer pair)、知识库alpha(混合检索策略)、以及知识库kms(召回分值阈值)
  • springboot如何集成mybatis?
  • 喜讯!迈威通信TSN产品通过“时间敏感网络(TSN)产业链名录计划”评测,各项指标名列前茅
  • 使用vscode调试wails项目(golang桌面GUI)
  • Python+PyCharm安装和配置(详细步骤)
  • 【C++】map详解(键值对的概念,与multimap的不同)
  • awk脚本和python脚本版本
  • 打破常规,BD仓储物流的效能提升!
  • python xml的读取和写入
  • 【C++网络编程】(一)Linux平台下TCP客户/服务端程序
  • 学习小课堂
  • ssm基于Javaee的影视创作论坛的设计与实现
  • SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
  • 网络风暴产生原因、危害、预防和解决方法
  • 【书生浦语实战】茴香豆企业级知识库问答工具-搭建Dify问答助手
  • k8s 1.28.2 集群部署 MinIO 分布式存储
  • 路径跟踪之导航向量场——二维导航向量场