React避免不必要的重新渲染的方法示例

 更新时间:2024年10月11日 09:38:17   作者:liangshanbo1215  
构建高性能 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 状态发生变化时重新渲染。

以上就是React避免重新渲染的方法示例的详细内容,更多关于React避免重新渲染的资料请关注脚本之家其它相关文章!

相关文章

  • 在React框架中实现一些AngularJS中ng指令的例子

    在React框架中实现一些AngularJS中ng指令的例子

    这篇文章主要介绍了在JavaScript的React框架中实现一些AngularJS指令的例子,React使用Virtual DOM因而与普通的js框架有些不同,需要的朋友可以参考下
    2016-03-03
  • 使用React Native创建以太坊钱包实现转账等功能

    使用React Native创建以太坊钱包实现转账等功能

    这篇文章主要介绍了使用React Native创建以太坊钱包,实现转账等功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • react component changing uncontrolled input报错解决

    react component changing uncontrolled in

    这篇文章主要为大家介绍了react component changing uncontrolled input报错解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 简单分析React中的EffectList

    简单分析React中的EffectList

    这篇文章主要简单分析了React中的EffectList,帮助大家更好的理解和学习使用React进行前端开发,感兴趣的朋友可以了解下
    2021-04-04
  • React Native模块之Permissions权限申请的实例相机

    React Native模块之Permissions权限申请的实例相机

    这篇文章主要介绍了React Native模块之Permissions权限申请的实例相机的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • mobx在react hooks中的应用方式

    mobx在react hooks中的应用方式

    这篇文章主要介绍了mobx在react hooks中的应用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 使用 React hooks 实现类所有生命周期

    使用 React hooks 实现类所有生命周期

    react 自 16.8 开始,引入了 Hooks 概念,使得函数组件中也可以拥有自己的状态,并且可以模拟对应的生命周期,这篇文章主要介绍了使用 React hooks 怎么实现类里面的所有生命周期,需要的朋友可以参考下
    2023-02-02
  • 详解react-refetch的使用小例子

    详解react-refetch的使用小例子

    这篇文章主要介绍了详解react-refetch的使用小例子,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • react中使用heatmap.js实现热力图的绘制

    react中使用heatmap.js实现热力图的绘制

    heatmap.js 是一个用于生成热力图的 JavaScript 库,React 是一个流行的 JavaScript 库,用于构建用户界面,本小编给大家介绍了在React 应用程序中使用heatmap.js实现热力图的绘制的示例,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • react 创建单例组件的方法

    react 创建单例组件的方法

    这篇文章主要介绍了react 创建单例组件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04

最新评论