在 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的更多相关文章

  1. react中使用immutable

    官方文档(https://immutable-js.github.io/immutable-js/docs/#/) 有人说 Immutable 可以给 React 应用带来数十倍的提升,也有人说 Im ...

  2. 在react/redux中使用Immutable

    在redux中使用Immutable 1.什么是Immutable? Immutable是一旦创建,就不能被更改的数据. 对Immutable对象的任何修改或添加删除操作都会返回一个新的Immutab ...

  3. Immutable学习及 React 中的实践

    为什么用immutable.js呢.有了immutable.js可以大大提升react的性能. JavaScript 中的对象一般是可变的(Mutable),因为使用了引用赋值,新的对象简单的引用了原 ...

  4. react 学习与使用记录

    相关技术:webpack+react+react-router+redux+immutable 郭永峰react学习指南 1.git bash--windows命令行工具 --教程 下载地址 2. i ...

  5. 实例讲解基于 React+Redux 的前端开发流程

    原文地址:https://segmentfault.com/a/1190000005356568 前言:在当下的前端界,react 和 redux 发展得如火如荼,react 在 github 的 s ...

  6. 一个基于React整套技术栈+Node.js的前端页面制作工具

    pagemaker是一个前端页面制作工具,方便产品,运营和视觉的同学迅速开发简单的前端页面,从而可以解放前端同学的工作量.此项目创意来自网易乐得内部项目nfop中的pagemaker项目.原来项目的前 ...

  7. React-用ImmutableJS提高性能

    一.需求 1.子组件有更新时,只重新渲染有变化的子组件,而不是全部 二.ImmutableJS原理 三.代码 1.CheckboxWithLabel.jsx var React = require(' ...

  8. CommonsChunkPlugin并不是分离第三方库的好办法(DllPlugin科学利用浏览器缓存)

    webpack算是个磨人的小妖精了.之前一直站在glup阵营,使用browserify打包,发现webpack已经火到爆炸,深怕被社区遗落,赶紧拿起来把玩一下.本来只想玩一下的.尝试打包了以后,就想启 ...

  9. 使用 webpack 优化资源

    在前端应用的优化中,对加载资源的大小控制极其的重要,大多数时候我们能做的是在打包编译的过程对资源进行大小控制.拆分与复用.本片文章中主要是基于 webpack 打包,以 React.vue 等生态开发 ...

  10. webpack分离第三方库(CommonsChunkPlugin并不是分离第三方库的好办法DllPlugin科学利用浏览器缓存)

    webpack算是个磨人的小妖精了.之前一直站在glup阵营,使用browserify打包,发现webpack已经火到爆炸,深怕被社区遗落,赶紧拿起来把玩一下.本来只想玩一下的.尝试打包了以后,就想启 ...

随机推荐

  1. 浅谈C#语言中的各种数据类型,与数据类型之间的转换

    什么是数据类型? 数据类型,百度百科是这样解释的:数据类型在数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作.这样的解释对于一个初学者来说未必太过于深奥. 简单点说,数据类型就是不同长度的 ...

  2. 解决腾讯云封锁SS(shadow--socks)访问google问题

    腾讯云windows主机,若使用SS(shadow--socks)采用加密算法aes-256-cfb,访问google的时候会被dropped connection. 解决办法更改ss server加 ...

  3. caffe实现年龄及性别预测

    一.相关代码及训练好的模型 eveningglow/age-and-gender-classification: Age and Gender Classification using Convolu ...

  4. 页面滚动图片等元素动态加载插件jquery.scrollLoading.js

    如果一个网页很长,那么该页面的加载时间也会相应的较长.而这里给大家介绍的这个jQuery插件scrollLoading的作用则是,对页面元素进行动态加载,通俗的说就是滚到哪就加载到哪,屏幕以下看不见的 ...

  5. DiscuzX /source/function/function_core.php通用核心函数库文件分析

    ... <?php /** * [Discuz!] (C)2001-2099 Comsenz Inc. * This is NOT a freeware, use is subject to l ...

  6. 【rabbitmq】RabbitMQ 集群与网络分区

    网络分区(network partitions) 官网-网络分区 网络设备故障导致的网络分裂.比如,存在A\B\C\D\E五个节点,A\B处于同一子网,B\C\D处于另外一子网,中间通过交换机相连.若 ...

  7. Windows FFMPEG开发环境配置

    1.去FFMPEG网站上下载Dev版本的库,里面有我们需要的头文件和lib文件,然后下载Shared版本的库,里面有我们需要的dll文件 http://ffmpeg.zeranoe.com/build ...

  8. Group(), Groups(),& Groupdict() 用法

    group() 返回一个或多个匹配的字串.如果只有一个参数,结果只有单个字符串:如果有多个参数,结果是一个元组,元组里每一项对应一个参数.没有参数,group1默认是0(整个匹配串被返回).如果gro ...

  9. Java程序国际化学习代码一

    Java程序国际化初识 1.基本思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每 ...

  10. 基于Python的设计模式简述

    结构梳理>>> 第一部分: 创建型模式 工厂模式 工厂方法 抽象工厂 建造者模式 原型模式 单例模式 第二部分: 结构型模式 适配器模式 修饰器模式 外观模式 享元模式 模型-视图- ...