在实际开发过程中,经常遇到根据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)

memorization-根据输入重新计算render的数据的更多相关文章

  1. ggplot2 提取stat计算出来的数据

    使用ggplot2 绘图时,我们只需要提供原始数据就可以了,ggplot2 内置了许多的计算函数,来帮助我们计算对应的数值. 最典型的的,当使用geom_boxplot 绘制箱线图时,我们只提供原始数 ...

  2. AI芯片:高性能卷积计算中的数据复用

    随着深度学习的飞速发展,对处理器的性能要求也变得越来越高,随之涌现出了很多针对神经网络加速设计的AI芯片.卷积计算是神经网络中最重要的一类计算,本文分析了高性能卷积计算中的数据复用,这是AI芯片设计中 ...

  3. 云计算OpenStack---云计算、大数据、人工智能(14)

    一.互联网行业及云计算 在互联网时代,技术是推动社会发展的驱动,云计算则是一个包罗万象的技术栈集合,通过网络提供IAAS.PAAS.SAAS等资源,涵盖从数据中心底层的硬件设置到最上层客户的应用.给我 ...

  4. 获取键盘输入或者USB扫描枪数据

    /// <summary> /// 获取键盘输入或者USB扫描枪数据 可以是没有焦点 应为使用的是全局钩子 /// USB扫描枪 是模拟键盘按下 /// 这里主要处理扫描枪的值,手动输入的 ...

  5. 1102: 零起点学算法09——继续练习简单的输入和计算(a-b)

    1102: 零起点学算法09--继续练习简单的输入和计算(a-b) Time Limit: 1 Sec  Memory Limit: 520 MB   64bit IO Format: %lldSub ...

  6. 1101: 零起点学算法08——简单的输入和计算(a+b)

    1101: 零起点学算法08--简单的输入和计算(a+b) Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitt ...

  7. Spark 介绍(基于内存计算的大数据并行计算框架)

    Spark 介绍(基于内存计算的大数据并行计算框架)  Hadoop与Spark 行业广泛使用Hadoop来分析他们的数据集.原因是Hadoop框架基于一个简单的编程模型(MapReduce),它支持 ...

  8. 使用基础知识完成java小作业?强化练习-1.输入数组计算最大值-2.输出数组反向打印-3.求数组平均值与总和-4.键盘输两int,并求总和-5.键盘输三个int,并求最值;

    完成几个小代码练习?让自己更加强大?学习新知识回顾一下基础? 1.输入数组计算最大值 2.输出数组反向打印 3.求数组平均值与总和 4.键盘输两int,并求总和 5.键盘输三个int,并求最值 /* ...

  9. Java JDBC 模糊查询 避免输入_,%返回全部数据

    Java JDBC 模糊查询 避免输入_,%返回全部数据 "SELECT * FROM employees WHERE INSTR(first_name,?)>0 " 仅供参 ...

随机推荐

  1. [高清] 深入浅出Spring Boot 2.x.pdf + 代码

    ------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...

  2. OI数学汇总

    最前面:\(\LaTeX\)可能需要加载一会,请耐心等待o~ 前言 数学在\(\text{OI}\)中十分重要.其中大多都是数论. 什么是数论? \[ 研究整数的理论 --zzq \] 本文包含所有侧 ...

  3. shell-基础2-字符串文本处理${}

    一.为什么使用${}引用变量 1.$a和${a}的效果与区别 因为个别特殊字符会影响正常引用,所以需要使用${}引用变量,加花括号是为了帮助解释器识别变量的边界 $a和${a}效果一样,当变量后面连接 ...

  4. 如何在Unity中创造真实的水

    你将要创造什么 Unity是由Unity Technologies开发的多平台游戏引擎,用于为控制台,移动设备,计算机甚至网站等多种设备创建视频游戏和应用程序.Unity的核心优势在于其稳健性,可移植 ...

  5. BUAA OO 2019 第四单元作业总结

    目录 第四单元总结 总 UML UML 类图 UML 时序图 UML 状态图 架构设计 第十三次作业 第十四次作业 课程总结 历次作业总结 架构设计 面向对象方法理解 测试方法理解与实践 改进建议 尽 ...

  6. python3基础之“小练习(1)”

    (一)打印3个不同的字符 # a=int("123") # b="123" # c=1.2 # print(type(a),a) # print(type(b) ...

  7. springmvc集成cxf的方法

    最近需要在项目中增加webservice接口,供三方调用,下面就把集成的方法展示如下,供大家参考: 第一步:服务端的发布; 1:配置web.xml文件,添加cxf的servlet <servle ...

  8. Invalid escape sequence at line 1 column 29 path $[0].name

    编译报错:Invalid escape sequence at line 1 column 29 path $[0].name 解决:grade.properties 文件下 org.gradle.j ...

  9. linu学习记录--初学linux中的几个基本命令以及比较关键的man指令

    import chardet chardet.detect() #传入参数可以输出查看参数的对应编码 首先是用decode将对象编码转换成unicode,然后用encode将对象编码转换成输出所需,u ...

  10. 虚拟机搭建IKUAI软路由

    1.登录爱快软路由的官网下载镜像(支持ISO ,GHO),这里采用iso安装 2.选择好后开机(选择数字编号1,回车) 3.输入“y”回车,程序自动安装 4.安装成功后如图 5.设置IP 6.绑定网卡 ...