memorization-根据输入重新计算render的数据
在实际开发过程中,经常遇到根据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的数据的更多相关文章
- ggplot2 提取stat计算出来的数据
使用ggplot2 绘图时,我们只需要提供原始数据就可以了,ggplot2 内置了许多的计算函数,来帮助我们计算对应的数值. 最典型的的,当使用geom_boxplot 绘制箱线图时,我们只提供原始数 ...
- AI芯片:高性能卷积计算中的数据复用
随着深度学习的飞速发展,对处理器的性能要求也变得越来越高,随之涌现出了很多针对神经网络加速设计的AI芯片.卷积计算是神经网络中最重要的一类计算,本文分析了高性能卷积计算中的数据复用,这是AI芯片设计中 ...
- 云计算OpenStack---云计算、大数据、人工智能(14)
一.互联网行业及云计算 在互联网时代,技术是推动社会发展的驱动,云计算则是一个包罗万象的技术栈集合,通过网络提供IAAS.PAAS.SAAS等资源,涵盖从数据中心底层的硬件设置到最上层客户的应用.给我 ...
- 获取键盘输入或者USB扫描枪数据
/// <summary> /// 获取键盘输入或者USB扫描枪数据 可以是没有焦点 应为使用的是全局钩子 /// USB扫描枪 是模拟键盘按下 /// 这里主要处理扫描枪的值,手动输入的 ...
- 1102: 零起点学算法09——继续练习简单的输入和计算(a-b)
1102: 零起点学算法09--继续练习简单的输入和计算(a-b) Time Limit: 1 Sec Memory Limit: 520 MB 64bit IO Format: %lldSub ...
- 1101: 零起点学算法08——简单的输入和计算(a+b)
1101: 零起点学算法08--简单的输入和计算(a+b) Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lldSubmitt ...
- Spark 介绍(基于内存计算的大数据并行计算框架)
Spark 介绍(基于内存计算的大数据并行计算框架) Hadoop与Spark 行业广泛使用Hadoop来分析他们的数据集.原因是Hadoop框架基于一个简单的编程模型(MapReduce),它支持 ...
- 使用基础知识完成java小作业?强化练习-1.输入数组计算最大值-2.输出数组反向打印-3.求数组平均值与总和-4.键盘输两int,并求总和-5.键盘输三个int,并求最值;
完成几个小代码练习?让自己更加强大?学习新知识回顾一下基础? 1.输入数组计算最大值 2.输出数组反向打印 3.求数组平均值与总和 4.键盘输两int,并求总和 5.键盘输三个int,并求最值 /* ...
- Java JDBC 模糊查询 避免输入_,%返回全部数据
Java JDBC 模糊查询 避免输入_,%返回全部数据 "SELECT * FROM employees WHERE INSTR(first_name,?)>0 " 仅供参 ...
随机推荐
- 06-switch语句
switch语句 switch是一个条件语句,它是可以代替多个if else的常用方式 例子 package main import "fmt" func main() { a:= ...
- 怎么理解js的原型链继承?
前言 了解java等面向对象语言的童鞋应该知道.面向对象的三大特性就是:封装,继承,多态. 今天,我们就来聊一聊继承.但是,注意,我们现在说的是js的继承. 在js的es6语法出来之前,我们想实现js ...
- Python 获取本月的最后一天
一.需求 现在有一个场景,需要每月的最后一天,发送一封邮件. 二.获取本月最后一天 有没有办法使用Python的标准库轻松确定(即一个函数调用)给定月份的最后一天? 答案是有的,使用 datetime ...
- go语言学习笔记---读取文件io/ioutil 包
io/ioutil 包几个函数方法 名称 作用 备注 ReadAll 读取数据,返回读到的字节 slice 1 ReadDir 读取一个目录,返回目录入口数组 []os.FileInfo, 2 Re ...
- .Net Core 注入学习——注册服务
解析 .Net Core 注入——注册服务发表于:2017-10-23 10:47 作者:行走即歌 来源:51Testing软件测试网采编字体:大 中 小 | 上一篇 | 下一篇 |我要投稿 | 推荐 ...
- node.js开发 1-概述
https://www.cnblogs.com/gaoya666/p/9071288.html Nodejs英文网:https://nodejs.org/en/ 中文网:http://nodejs.c ...
- iOS - app 进行安全加固
研究了大半年逆向工程了,没在博客做记录,最近看到篇,跟自己的想法不谋而合,摘要下: 运行在越狱设备上的 iOS app,非常容易遭到破解分析,这里我列举一些可以加大破解难度的方法,希望有所帮助. 一些 ...
- HTML学习摘要2
DAY 2 HTML 标签可以拥有属性.属性提供了有关 HTML 元素的更多的信息. 属性总是以名称/值对的形式出现,比如:name="value". 属性总是在 HTML 元素的 ...
- C++线程同步之事件(生产者与消费者问题)
#include <windows.h> #include <stdio.h> HANDLE g_hSet = NULL; HANDLE g_hClear = NULL; HA ...
- Jmeter学习笔记(十二)——断言
一.断言简介 jmeter中有个元件叫做断言(Assertion).用于检查测试中得到的响应数据等是否符合预期,用以保证性能测试过程中的数据交互与预期一致. 使用断言的目的:在request的返回层面 ...