PureComponent和React.memo()区别


前言

本篇文章主要讲解了,PureComponent和React.memo()区别及用法。


一、区别

PureComponentReact.memo() 都是 React 中优化组件性能的方式。

  1. PureComponent 是一个类组件,而 React.memo() 是一个高阶函数。

  2. React.memo 是一个高阶函数,它接受一个组件并返回一个新的组件,它通过浅比较当前和之前的 props 值来判断是否应该重新渲染组件。它提供第二个参数来自定义比较逻辑,可以用在深层次的比较上面。如果 props 没有变化,则组件不会重新渲染。

  3. React.PureComponent 是一个类组件,它通过比较当前和之前的 props 和 state 值来检查是否需要重新渲染组件。如果 state 和 props 没有发生变化,则组件不会重新渲染。在PureComponent内部,它实现了一个shouldComponentUpdate方法,用于判断组件是否需要更新。这个方法默认会对组件的state和props进行浅比较,如果没有变化,那么就会返回false,阻止重新渲染。

二、用法

使用PureComponent 效果
这是一个app组件—负责更新props给到子组件

class App extends React.Component {
  constructor() {
    super()
    this.state = {
      appProps: "---AppProps---"
    }
  }
  updateProps = () => {
    this.setState({appProps: '---update AppProps---'})
  }
  render() {
    const {appProps, show} = this.state
    return (
      <div className="App">
        <TestLifeCycle appProps={appProps} />
        <button onClick={this.updateProps}>更新props</button>
      </div>
    )
  }
}
export default App

这是一个子组件—负责更新自己的state,和接收了一个app的props

class TestLifeCycle extends PureComponent {

  constructor () {
    console.log('constructor---')
    super()
    this.state = {
      state1: 'This is a React class.'
    }
  }

  updateState = () => {
    this.setState({
      state1: 'This is a React class. updateState'
    })
  }

  render () {
    console.log('render---')
    const { appProps } = this.props
    return (
      <>
        <div>{ this.state.state1 }</div>
        <div>{ appProps }</div>
        <button onClick={ this.updateState }>更新state</button>
      </>
    )
  }
}
export default TestLifeCycle

更新之前效果在这里插入图片描述
更新state和props之后效果在这里插入图片描述
当我多次点击更新state和更新props的时候,可以看到控制台只是做了两次render。达到了我们的预期效果。
下面我们把数据结构调整为对象再看看:

this.state = {
  state1: {
    text: 'This is a React class.'
  }
}

在这里插入图片描述
能看到当我们改成对象,并更新state时,多次点击,会多次渲染,并不能实现,这个时候我们可以使用生命周期钩子来优化,也可以达到效果。

shouldComponentUpdate(props, state) {
  console.log(props,state)
  if (state.state1.text === this.state.state1.text) {
    return false
  }
  return true
}

同理修改props也是这样的效果。

使用React.mome()效果
导出时用React.memo,并接受两个参数,一个是组件本身,一个是修改props的回调,可在这里做优化,返回一个boolean值,由于这里的比较也是浅比较,所以深层次的比较还是得用到回调函数。

export default React.memo(TestLifeCycle, (preProps, nextProps) => {
  console.log(preProps, nextProps)
  if (preProps.appProps.text === nextProps.appProps.text) {
    return false
  }
  return true
})

具体效果不贴了,感兴趣可以实际操作一下。


如果有问题欢迎指正

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`React.memo` 是 React 中的一个高阶组件,用于优化组件的性能。它与 `React.PureComponent` 类似,但适用于函数组件而不是类组件。 使用 `React.memo` 可以避免在某些情况下不必要的重渲染。当组件的 props 发生变化时,React 会重新渲染该组件。但如果 props 没有发生变化,就没有必要重新渲染组件。这时,`React.memo` 就可以发挥作用。 `React.memo` 的基本用法如下: ```jsx import React from 'react'; function MyComponent(props) { // 组件的渲染逻辑 } export default React.memo(MyComponent); ``` 在这个例子中,我们将 `MyComponent` 组件使用 `React.memo` 包裹起来,这样就可以实现组件的记忆功能。当 `MyComponent` 组件的 props 发生变化时,`React.memo` 会比较前后两个 props 是否相等,如果相等就不会重新渲染组件,否则就会重新渲染组件。 需要注意的是,`React.memo` 只会对 props 进行浅比较,因此如果 props 是一个对象或数组,而且它们的值发生了变化,但引用没有变化,`React.memo` 仍然会认为它们相等。在这种情况下,你需要手动处理 props 的深层次变化,或者使用其他的优化工具,例如 `useMemo`、`useCallback` 等等。 另外,需要注意的是,虽然 `React.memo` 可以帮助我们优化组件的性能,但也不应该滥用。在大多数情况下,React 自身已经能够很好地处理组件的渲染,并且重渲染通常也不会带来太大的性能问题。只有在某些情况下,例如组件渲染比较频繁,或者组件的渲染成本比较高时,才需要考虑使用 `React.memo` 进行优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值