写出更优雅的react组件(避免重复渲染)

一、存在问题

一个父组件下面有几个子组件,更改其中一个子组件的数据,其它所有子组件都会重新渲染。
举例:比如说一个父组件(Parent.js)下面有两个子组件(ChildA.js、ChildB.js)。代码如下
(1)、ChildA.js文件:

import React from "react";
export default class ChildA extends React.Component {
   
  render() {
   
    console.log("ChildA 的render方法执行了");
    return (
      <div className="childA">
        子组件A的内容:
        {
   this.props.text}
      </div>
    );
  }
}

(2)、ChildB.js文件:

import React from "react";
export default class ChildB extends React.Component {
   
  render() {
   
    console.log("ChildB 的render方法执行了");
    return (
      <div className="childB">
        子组件B的内容:
        {
   this.props.text}
      </div>
    );
  }
}

(3)、 Parent.js文件:在共同的父组件 Parent.js 中,会将 ChildA 和 ChildB 组合起来,并分别向其中注入数据

import React from "react";
import ChildA from './ChildA'
import ChildB from './ChildB'
class Parent extends React.Component {
   
  state = {
   
    textA: '我是A的文本',
    textB: '我是B的文本'
  }
  
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React 中,有几种方式可以避免组件重复渲染: 1. 使用 PureComponent:PureComponent 会自动进行浅比较,仅在 props 或 state 发生变化时重新渲染组件。但是,如果组件的 props 是一个对象,使用 PureComponent 的浅比较可能无法准确判断是否发生变化。 2. 实现 shouldComponentUpdate 方法:通过自定义 shouldComponentUpdate 方法,可以在组件接收到新的 props 或 state 时进行深层比较,判断是否需要重新渲染。在该方法中,可以使用深层比较的方式来判断对象的值是否发生变化。 下面是一个示例,展示了如何在 shouldComponentUpdate 方法中实现深层比较: ```jsx class MyComponent extends React.Component { shouldComponentUpdate(nextProps, nextState) { if (this.props.someObject !== nextProps.someObject) { // 使用深层比较判断对象的值是否发生变化 const arePropsEqual = deepEqual(this.props.someObject, nextProps.someObject); if (!arePropsEqual) { return true; } } // 其他判断逻辑... return false; } // 其他组件逻辑... } ``` 在上述示例中,使用 deepEqual 函数对对象进行深层比较。deepEqual 函数可以使用第三方库(如 lodash 的 isEqual 函数)或自定义实现。 需要注意的是,深层比较可能会带来一定的性能开销,因为需要递归遍历对象的每个属性进行比较。因此,在使用深层比较时,需要权衡利弊,确保它在特定场景下能够带来性能的提升。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值