在实际开发过程中,经常遇到根据props和state变化,重新计算“渲染阶段”需要的数据的情况。

如:根据输入的值实时过滤select列表,或者表格数据(查询过滤)。

问题特点:

1. 每次渲染都会调用相关操作

2. 进行的操作都是和渲染相关的,如根据参数计算渲染需要的数据

常用方法:

1)在getDerivedStateFromProps()中判断涉及的属性变化,来更新数据。

这种方法在涉及属性较多时,特别复杂。

2)在render()方法中计算数据,并且使用PureComponent。

这种方法只要render就会计算,即使其他无关属性,也会导致重新渲染,从而触发计算。

特别是数据较大时,特别影响性能。

memoization技术

memoization函数可以解决上面两个方法的弊端。

“memoize-one”只缓存最后一次的结果,不会触发内存泄漏。

示例代码:

import React, {PureComponent} from 'react';
import ReactDOM from 'react-dom';
import memoize from 'memoize-one'; class App extends PureComponent {
constructor(props) {
super(props);
this.state = {
list: []
}
this.inputRef = React.createRef();
}
add = () => {
this.setState(state => ({
list: state.list.concat(this.inputRef.current.value)
}))
}
render() {
return (
<div>
<Child list={this.state.list} />
<br/>
<input defaultValue="" ref={this.inputRef} />
<button onClick={this.add}>ClikeMe Add</button>
</div>
)
}
} class Child extends React.Component {
state = {
filterText: null
}
// memoize-one可以缓存最后一次的数据和结果;避免内存泄漏
// 否则在getDerivedStateFromProps中需要比较list前后的值和filterText前后的值
// 来避免重复计算
filter = memoize(
(list, filterText) => list.filter(i => i.includes(filterText))
)
handleChange = (e) => {
this.setState({
filterText: e.target.value
})
}
render() {
const filterList = this.filter(this.props.list, this.state.filterText)
return (
<form>
<fieldset>
<legend>过滤参数</legend>
<input onChange={this.handleChange}/>
</fieldset>
{
filterList && filterList.map((i,index) => (
<div key={i}>{index}---{i}</div>
))
}
</form>
)
}
}
ReactDOM.render(<App/>, window.root)

最新文章

  1. Nginx与tomcat组合的简单使用
  2. c++智能指针实现方式1
  3. linux配置文件的一些调优
  4. Java基础-JVM内存回收
  5. for each 循环
  6. iOS 指纹解锁
  7. 微信授权登陆接入第三方App(步骤总结)Android
  8. 【剑指offer】打印1到最大的n数字
  9. 在Activiti中如何使用自定义的组织架构
  10. 使用工厂方法模式实现多数据库WinForm手机号码查询器(附源码)
  11. JDK源代码学习-ArrayList、LinkedList、HashMap
  12. linux配置java环境变量jdk jre(详细)【转】
  13. 【JAVA SPRING】IOC与AOP
  14. winform窗体 小程序【线程】
  15. Dubbo 实例
  16. wireshark和RawCap跟踪并解决中文乱码问题
  17. end=‘’
  18. git的时候 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
  19. 【SIKIA计划】_07_Unity3D游戏开发-坦克大战笔记
  20. erlang资料

热门文章

  1. java笔记--java的语言特性
  2. docker(一): 安装
  3. ByteArray、16进制、字符串之间的转换
  4. Spark 系列(一)—— Spark简介
  5. IdentityServer4实现Oauth2.0四种模式之隐藏模式
  6. 通俗易懂的join、left join、right join、full join、cross join
  7. 【洛谷 P2597】 [ZJOI2012]灾难(LCA)
  8. Django:web认识,jinja2模块,如何安装Django
  9. android 给ImageView设置路径
  10. Tortoise SVN常见图标含义及图标无法正常解决方法!