【问题标题】:Using lodash in shouldComponentUpdate在 shouldComponentUpdate 中使用 lodash
【发布时间】:2016-10-23 18:38:09
【问题描述】:

这被认为是最佳做法吗?还是有更好的解决方案来防止不必要的重新渲染?

我正在尝试渲染数千行。每行有许多单元格。但是当我在我的一个减速器中更新不相关的状态时,我很难防止瓶颈。

import React, { Component } from 'react'
import _ from 'lodash'

import Cell from './Cell'

export class Row extends Component {

  shouldComponentUpdate (newProps) {
    return !_.isEqual(newProps.item, this.props.item)
  }

  componentDidUpdate (prevProps, prevState) {
    console.log('row is updated!')
  }

  render () {
    const { item } = this.props

    return (
      <div className='rowek'>
        {item.map((i, key) => <Cell key={key} item={i}/>)}
      </div>
    )
  }
}

export default Row

【问题讨论】:

  • 我有类似的结构,我也使用 shouldComponentUpdate。
  • 是的,这很正常,如果您使用的是最新版本的 React,您可以使用 class Row extends PureComponent,它正是这样做的。

标签: reactjs redux react-redux


【解决方案1】:

我在构建日历时也有类似的经历,其中每个日期都包含异步数据。

我的建议:

  • ShouldComponentUpdate 会降低应用程序的性能,react 的默认行为已经足以处理这种情况并避免在数据未更改时重新渲染。 也可以看看:https://facebook.github.io/react/docs/react-api.html#react.purecomponent

  • 测试您的应用程序在生产环境中是否真的很慢。 (缩小文件,无操作记录器等)。

  • key={key}我不会相信这是我单元格的键,尝试在前面加上行号或更具体的东西。

  • 有没有一种方法可以将每个单元格直接映射到状态属性? (不知道你们州的设计)

@Cell.js

const mapStateToProps = (state, { index }) => ({
    item: selectItemByCellIndex(index),
});

【讨论】:

  • 我可以使用直接引用,但我也想过滤行并执行一些其他逻辑。 ImmutableJs 可能是唯一的答案?
  • 我认为 ImmutableJs 不会让这变得更好,因为您的状态仍将代表更改,请尝试将行直接引用到您的状态的一部分,这是我在日历场景中所做的,我的日期只是迭代属于其周的数据。
  • 它并没有真正帮助我,但我很感激你的时间。我应该发布更多示例。 ://
猜你喜欢
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多