javascript - 在道具中传递对象时避免重新渲染孩子
问题描述
假设我有一个这样的性能优化组件:
const PerformanceComponent = ({style}) => {
return <View style={style}>...</View>
}
export default React.memo(PerformanceComponent)
我正在使用父级内部的组件,如下所示:
{someArray.map((style) => (
<PerformanceComponent style={style} />
)}
我为 传递不同的对象style
,它看起来像这样:
const styles = {
width: 200,
height: 200
}
现在 React.memo 将无法解决问题,因为我正在传递一个对象,而 React 只会比较内存地址(我认为它称为Shallow Compare)。
即使-object 没有改变,我有什么选择可以避免不必要的重新渲染( )?PerformanceComponent
styles
解决方案
正如其他答案所说,您需要将一个函数作为第二个参数传递给React.memo
它将接收前一个道具和当前道具,以便您可以决定是否应该重新渲染组件(就像shouldComponentUpdate
类组件的生命周期一样)。
因为比较整个对象以查看是否有任何更改可能是一项昂贵的操作(取决于对象)并且因为您可以拥有多个属性,所以确保它有效的一种方法是使用 lodash _.isEqual。
import { isEqual } from 'lodash'
const PerformanceComponent = ({style}) => {
return <View style={style}>...</View>
}
export default React.memo(PerformanceComponent, isEqual)
这样你就不必担心实现它isEqual
并且它也有很好的性能。
推荐阅读
- json - Spring rest 模板无法从 text/html 转换
- go - 迭代复数
- javascript - 在 Ember.js 上使用 bower install 安装 dygraphs 失败
- python - 用 python 转换一个 .dat 文件
- xquery - 如何解决 XDMP-CONFLICTINGUPDATES?
- delphi - 导出到 Word“Docx”期间的快速报告 5 VCL 问题。"µg/kg" 被导出为 "µg/kg"
- groovy - 带有 SoapUI groovy 的 Shell 命令
- jenkins - 在管道共享库中使用外部依赖项
- python-3.x - PyCharm (Python 3.6) 控制台中的全局变量值
- javascript - 将类添加到
- 包含标签的元素