在实际开发过程中,经常遇到根据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. quartz2.3.0(十三)数据库持久化定时器job任务和trigger触发器,在多个调度器实例情况下,由其它调度器实例恢复执行调度器宕机的job任务

    一.初始化数据库11张quartz表:qrtz_*   先从官网下载好quartz2.3.0包:http://www.quartz-scheduler.org/downloads/ 解压后进入目录:q ...

  2. tkinter学习笔记_06

    12.弹窗 messagebox import tkinter as tk from tkinter import messagebox root = tk.Tk() root.title(" ...

  3. java 获取手机归属地,引起net.UnknownHostException错误

    这个问题是请求,重定向了,跟入源码.修改了地址,变成302 Connection connect = Jsoup.connect(url); connect.header("Host&quo ...

  4. 日志之slf4j和logback日志系统(二)

    这篇文章我们讲一下,如何使用slf4j和logback组合来搭建一套日志系统. 介绍 如果我们的系统是新系统,也就是之前没有引入其他的日志工具,那么只需要引入,如果之前已经用了common-loggi ...

  5. Eclipse开发环境(一):下载和安装

    一.Eclipse下载及安装 1. 下载 进入官网https://www.eclipse.org/,点击 IDE & Tools 选择Java EE 选择Luna Packages 选择Win ...

  6. 配置APP的图标

    https://www.cnblogs.com/hupo376787/p/10290840.html 上一篇文章说到  Flutter - 自动生成Android & iOS图标 通过flut ...

  7. OC与swift相互调用

    一.OC调用swift文件 二.swift调用OC文件 三.注意和总结 添加: 四.自定义桥接文件 一.OC调用swift文件 在OC项目中创建一个swift文件的时候,Xcode 会提示 需要创建一 ...

  8. Flask中jinja2的应用

    Flask中jinja2的应用 # -*- coding: utf-8 -*- # @Time : 2019/9/24 17:29 # @Author : AnWen from flask impor ...

  9. go语言实现分布式id生成器

    本文:https://chai2010.cn/advanced-go-programming-book/ch6-cloud/ch6-01-dist-id.html 分布式id生成器 有时我们需要能够生 ...

  10. rabbitmq实战:一、天降奇兵

    缘由,最近换了工作,而新的项目中使用了celery+rabbitmq来实现一个分布式任务队列系统,为了能够维护好这套系统,只能来学习一下这两个组件,顺便把学习笔记记录下来,留作以后回顾,当然如果碰巧能 ...