react 和 seamless-immutable
在 react 中,默认改变组件状态或者属性,是会整个组件全部重新渲染,但是 如果只是修改一个地方,而全部渲染,就会浪费资源,大项目中会造成性能问题
shouldComponentUpdate
shouldComponentUpdate 在 react生命周期中就是控制是否重新渲染组件的方法,而该方法默认返回true, 这意味着就算没有改变组件的props或者state,也会导致组件的重绘。这就经常导致组件因为不相关数据的改变导致重绘,这极大的降低了React的渲染效率,这个问题,可以测试出来的
PureComponent 和 Component 的区别
React.PureComponent 与 React.Component 几乎完全相同,但 React.PureComponent 会自动通过props和state的浅对比来控制是否重新渲染组件
如果在 PureComponent 组件中,重写了 shouldComponentUpdate 方法 会根据 shouldComponentUpdate方法返回值判断是否重新渲染
PureComponent 优缺点
优点: 不需要开发者自己实现shouldComponentUpdate,就可以进行简单的判断来提升性能。
缺点:可能会因深层的数据不一致而产生错误的否定判断,从而shouldComponentUpdate结果返回false,界面得不到更新。
例如:
在父组件中,给子组件 传一个数组对象 var data = [{name:'zs',age: 23},{name:'ls',age: 26}],子组件用这个data 去渲染数据,
然后在父组件中 修改data,例如 data[0].age = 1, data.push({name:'ww',age: 30}), 这一系列操作,在 PureComponent 下,子组
件是不会更新的,但是我们的数据却是更改了,这就是它的弊端,在简单数据类型是可以的,引用类型数据的比较,会出现问题。
这个时候要优化渲染 就要用到 seamless-immutable
具体看这2个网站
https://www.npmjs.com/package/seamless-immutable
https://segmentfault.com/a/1190000010438089
这里记录下部分 使用api
// 一下2种方式 功能是相同的, 把js 的数据类型转化成 不可改变的数据类型
Immutable.from([, , ]);
let arr = Immutable([, , ]); // 转成可修改的数据,才可以修改数据
let data = Immutable.asMutable(arr) // 数组
data.push() //添加元素
data[] = {name: "we", age: } // 对象
// 对象赋值
var obj = {};
let newObj = Immutable.setIn(obj, ['key'], data) var obj = {};
let newObj = obj.setIn(['key'], data)
shouldComponentUpdate 方法 配合 seamless-immutable 使用,就可以控制复杂复杂数据类型的更新渲染了
父组件:
import React, { Component } from 'react';
import { connect } from 'dva';
import Immutable from 'seamless-immutable';
import styles from './IndexPage.css';
import Example from "../components/Example.js"
class IndexPage extends Component{
    constructor(props){
        super(props)
        this.state = {
            flg: true,
            arr: Immutable.from([{name:'zs',age: },{name:'ls',age: }])
        }
    }
    //
    handClick = () => {
        let { flg} = this.state
        this.setState({
            flg: !flg
        })
    }
    handClick1 = () => {
        const {arr} = this.state;
        // 转换成可修改的数据
        let data = Immutable.asMutable(arr)
        let obj = data[]
        //数组可以直接赋值修改, 对象需要 setIn 方式修改,不可直接赋值修改,返回一个新对象
        data[] = obj.setIn(["age"], )
        console.log(data[])
        data.push({name:'ww',age: })
        this.setState({
            arr: Immutable(data)
        })
    }
    render(){
        const { flg, arr } = this.state;
        return(
             <div className={styles.normal}>
              <h1 className={styles.title} onClick={this.handClick}>Yay! Welcome to dva!</h1>
              <h1 className={styles.title} onClick={this.handClick1}>Yay! Welcome to dva!</h1>
              <div className={styles.welcome} />
              {
                  flg ? <ul className={styles.list}>
                        <li>To get started, edit <code>src/index.js</code> and save to reload.</li>
                        <li><a href="https://github.com/dvajs/dva-docs/blob/master/v1/en-us/getting-started.md">Getting Started</a></li>
                      </ul>
                  :
                  ""
              }
              <Example data={arr}/>
            </div>
        )
    }
}
IndexPage.propTypes = {
};
export default connect()(IndexPage);
子组件:
import React, { Component } from 'react';
class Example extends Component{
    constructor(props){
        super(props)
        this.state = {
        }
    }
    shouldComponentUpdate(nextProps, nextState){
        if (this.props.data == nextProps.data) {
            return false
        }
        return true
    }
    render(){
        const { data } = this.props
        return(
            <div>
              {
                  data.map((item,i)=>
                    <div key={i}>
                        <span>{item.name}</span>
                        <span>{item.age}</span>
                    </div>
                  )
              }
            </div>
        )
    }
}
Example.propTypes = {
};
export default Example;
react 和 seamless-immutable的更多相关文章
- react中使用immutable
		
官方文档(https://immutable-js.github.io/immutable-js/docs/#/) 有人说 Immutable 可以给 React 应用带来数十倍的提升,也有人说 Im ...
 - 在react/redux中使用Immutable
		
在redux中使用Immutable 1.什么是Immutable? Immutable是一旦创建,就不能被更改的数据. 对Immutable对象的任何修改或添加删除操作都会返回一个新的Immutab ...
 - Immutable学习及 React 中的实践
		
为什么用immutable.js呢.有了immutable.js可以大大提升react的性能. JavaScript 中的对象一般是可变的(Mutable),因为使用了引用赋值,新的对象简单的引用了原 ...
 - react 学习与使用记录
		
相关技术:webpack+react+react-router+redux+immutable 郭永峰react学习指南 1.git bash--windows命令行工具 --教程 下载地址 2. i ...
 - 实例讲解基于 React+Redux 的前端开发流程
		
原文地址:https://segmentfault.com/a/1190000005356568 前言:在当下的前端界,react 和 redux 发展得如火如荼,react 在 github 的 s ...
 - 一个基于React整套技术栈+Node.js的前端页面制作工具
		
pagemaker是一个前端页面制作工具,方便产品,运营和视觉的同学迅速开发简单的前端页面,从而可以解放前端同学的工作量.此项目创意来自网易乐得内部项目nfop中的pagemaker项目.原来项目的前 ...
 - React-用ImmutableJS提高性能
		
一.需求 1.子组件有更新时,只重新渲染有变化的子组件,而不是全部 二.ImmutableJS原理 三.代码 1.CheckboxWithLabel.jsx var React = require(' ...
 - CommonsChunkPlugin并不是分离第三方库的好办法(DllPlugin科学利用浏览器缓存)
		
webpack算是个磨人的小妖精了.之前一直站在glup阵营,使用browserify打包,发现webpack已经火到爆炸,深怕被社区遗落,赶紧拿起来把玩一下.本来只想玩一下的.尝试打包了以后,就想启 ...
 - 使用 webpack 优化资源
		
在前端应用的优化中,对加载资源的大小控制极其的重要,大多数时候我们能做的是在打包编译的过程对资源进行大小控制.拆分与复用.本片文章中主要是基于 webpack 打包,以 React.vue 等生态开发 ...
 - webpack分离第三方库(CommonsChunkPlugin并不是分离第三方库的好办法DllPlugin科学利用浏览器缓存)
		
webpack算是个磨人的小妖精了.之前一直站在glup阵营,使用browserify打包,发现webpack已经火到爆炸,深怕被社区遗落,赶紧拿起来把玩一下.本来只想玩一下的.尝试打包了以后,就想启 ...
 
随机推荐
- java 线程理解
			
import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util. ...
 - java8_api_math
			
java.math包 BigDecimal BigInteger MathContext RoundingMode这是枚举 BigDecimal 不 ...
 - 005-docker启动设置环境变量
			
https://blog.csdn.net/wsbgmofo/article/details/79173920
 - dd/MMM/yyyy:hh:mm:ss +0800日期格式的转化
			
private static void myHandler() throws ParseException { String dtime1 = "23/Apr/2019:04:08:00 + ...
 - Windows Server 2008 R2 /2012 修改密码策略
			
今天建了域环境,在添加新用户的时候,发现用简单的密码时域安全策略提示密码复杂度不够,于是我就想在域安全策略里面把密码复杂度降低一点. 问题: 在“管理工具 >> 本地安全策略 > ...
 - OSPFV3综合实验 (第三组)
			
拓扑图 本次试验规划:拓扑分4个区域,其中区域2采用帧中继实现区域内互通的前提下配置OSPF.ospfv3.R7与R8之间配置rip实现互通,区域1作为nssa区域,实现路由注入.最终实现全局互通. ...
 - Python【每日一问】14
			
问:请介绍一下Python中的 import 机制 答: import 语句结合了两个操作:1.它先搜索指定名称的模块 2.将搜索结果绑定到当前作用域中的名称. 如果指定名称的模块未找到,则会引发 M ...
 - [UE4]Overlap Event 碰撞事件
			
一.对于VR中角色的手模型,一般是在角色中另外添加一个球型碰撞体 二.并且一定要勾选“Generate Overlap Events(触发重叠事件)”选项(默认状态是勾选的) 三.添加开始碰撞事件 ...
 - .net 多线程之线程取消
			
//线程取消不是操作线程,而是操作信号量(共享变量,多个线程都能访问到的东西,变量/数据库的数据/硬盘数据) //每个线程在执行的过程中,经常去查看下这个信号量,然后自己结束自己 //线程不能别人终止 ...
 - Spark下的FP-Growth和Apriori
			
基本概念 关联分析是一种在大规模数据集中寻找有趣关系的非监督学习算法.这些关系可以有两种形式:频繁项集或者关联规则.频繁项集(frequent item sets)是经常出现在一块的物品的集合,关联规 ...