React渲染優化之immutableJS(二)
在上一節實現了簡單的效能優化,但是因為需要一次深拷貝和屬性對比,效能還是不好,遂這裡使用Facebook大神寫的immutable.js進行進一步優化
immutable.js
JavaScript的不可變集合
每次修改都會返回一個新的物件,上一個物件始終會保持在哪裡,他提供一些常用的資料型別, 供我們使用,常見的資料型別如下:
List
:有序索引集,類似於 JavaScript 中的Array
。Map
:類似於 JavaScript 中的Object
。
這裡只展示兩個最常用的資料型別,想知道更多的型別,可以去immutabl官網 檢視
- 簡單的做法
let immutable = require('immutable')
let {Map, List} = immutable
let obj1 = Map({name: 'leo', age: 12)
console.log(obj1) // Map { "name": "leo", "age": 12 }
let obj2 = obj1.set('name', 'hello')
// 簡單的用法, 返回的物件和之前的物件是不一樣的,以下案例為證
console.log(obj2) // Map { "name": "hello", "age": 12 }
console.log(obj1 === obj2) // false
- 屬性會共享
let immutable = require('immutable')
let {Map, List, fromJS} = immutable
let obj1 = fromJS({ name: 'leo', age: 12, home: { name: 'shenzhen' } })
let obj2 = obj1.set('name', 'hello')
// 屬性會共享
console.log(obj1.home === obj2.home) // true
// 獲取物件的屬性數量
console.log(obj1.size) // 3
console. log(obj1.count()) // 3
- map的痛點
雖然map很好用,但是map只能執行一層,我們對2級更新屬性會報錯,需要是使用fromjs來處理物件
設定值 一層使用set,多層使用setIn
/取值:一層使用get,多層使用getIN
let immutable = require('immutable')
let {Map, fromJS} = immutable
let obj1 = fromJS({ name: 'leo', age: 12, home: { name: 'shenzhen' } })
let obj2 = obj1.set('name', 'hello')
let obj3 = obj1.setIn(['home', 'name'], 'new Name')
console.log(obj3) // Map { "name": "leo", "age": 12, "home": Map { "name": "new Name" } }
console.log(obj3.getIn(['home', 'name'])) // new Name
- 跟新值,update
let immutable = require('immutable')
let {Map, fromJS} = immutable
let obj1 = fromJS({ name: 'leo', age: 12, home: { name: 'shenzhen' } })
let obj2 = obj1.set('name', 'hello')
let obj3 = obj1.setIn(['home', 'name'], 'new Name')
let obj4 = obj3.update('age', val => val + 1)
console.log(obj3) // Map { "name": "leo", "age": 12, "home": Map { "name": "new Name" } }
console.log(obj3.getIn(['home', 'name'])) // new Name
console.log(obj4) // Map { "name": "leo", "age": 13, "home": Map { "name": "new Name" } }
- 刪除某個屬性
let immutable = require('immutable')
let {Map, fromJS} = immutable
let obj1 = fromJS({ name: 'leo', age: 12, home: { name: 'shenzhen' } })
let obj2 = obj1.set('name', 'hello')
let obj3 = obj1.setIn(['home', 'name'], 'new Name')
let obj4 = obj3.update('age', val => val + 1)
let obj5 = obj4.delete('age')
console.log(obj5) // Map { "name": "leo", "home": Map { "name": "new Name" } }
- 清空物件
let immutable = require('immutable')
let {Map, fromJS} = immutable
let obj1 = fromJS({ name: 'leo', age: 12, home: { name: 'shenzhen' } })
let obj2 = obj1.set('name', 'hello')
let obj3 = obj1.setIn(['home', 'name'], 'new Name')
let obj4 = obj3.update('age', val => val + 1)
let obj5 = obj4.delete('age')
let obj6 = obj4.clear()
console.log(obj6) // Map {}
- 合併物件 merge
let immutable = require('immutable')
let {Map, fromJS} = immutable
let obj1 = fromJS({ name: 'leo', age: 12, home: { name: 'shenzhen' } })
let obj2 = obj1.set('name', 'hello')
let obj3 = obj1.setIn(['home', 'name'], 'new Name')
let obj4 = obj3.update('age', val => val + 1)
let obj5 = obj4.delete('age')
let obj6 = obj4.clear()
let obj7 = obj6.merge({name: 'world', gender: 'man'})
console.log(obj7) // Map { "name": "world", "gender": "man" }
- 型別轉換
let immutable = require('immutable')
let {Map, fromJS} = immutable
let obj1 = fromJS({ name: 'leo', age: 12, home: { name: 'shenzhen' } })
let obj2 = obj1.set('name', 'hello')
let obj3 = obj1.setIn(['home', 'name'], 'new Name')
let obj4 = obj3.update('age', val => val + 1)
let obj5 = obj4.delete('age')
let obj6 = obj4.clear()
let obj7 = obj6.merge({name: 'world', gender: 'man'})
console.log(obj7.toJS()) // { name: 'world', gender: 'man' }
console.log(obj7.toJSON()) // { name: 'world', gender: 'man' }
console.log(obj7.toObject()) // { name: 'world', gender: 'man' }
immutable.js list
資料型別的簡單使用
操作方法和陣列類似
let immutable = require('immutable')
let { Map, List, fromJS } = immutable
let arr1 = List([1, 2, 3])
let arr2 = arr1.push(4)
let arr3 = arr2.pop()
let arr4 = arr3.map(item => item * 2)
let arr5 = arr4.filter(item => item < 5)
console.log(arr5) // List [ 2, 4 ]
let arr6 = arr5.update(1, val => val * 100)
console.log(arr6) // List [ 2, 400 ]
let arr7 = arr6.delete(0)
console.log(arr7) // List [ 400 ]
let arr8 = arr7.push(12)
console.log(arr8) // List [ 400, 12 ]
let arr9 = arr8.last()
console.log(arr9) // 12
immutable.js
對比方法
let {is, Map} = require('immutable')
let obj1 = Map({name: 'hello', age: 12})
let obj2 = Map({name: 'hello', age: 12})
console.log(Object.is(obj1, obj2)) // false
// immutable的is方法比較的是值
console.log(is(obj1, obj2)) // true
PureComponent
元件修改
import React, { Component } from 'react';
import { is } from "immutable";
class PureComponent extends Component{
shouldComponentUpdate (nextProps, nextState) {
// return !_.isEqual(nextState, this.state) 刪除這一行
// 拿到新老狀態, 在後邊進行比對
let oldState = this.state || {}
let newState = nextState ? nextState : {}
// 如果屬性鍵不同,直接更新頁面
let keys = Object.keys(newState)
if (Object.keys(oldState).length !== keys.length) return true;
for (var i = 0, len = keys.length; i < len; i++) {
let key = keys[i]
// 如果說屬性值不一樣,說明需要更新狀態
if(!is(newState[key], oldState[key])) return true
}
return false
}
}
export default PureComponent
index.js
元件修改
import React,{Component} from 'react';
import ReactDOM from 'react-dom';
import PureComponent from './PureComponent';
import _ from 'lodash'
let immutable = require('immutable')
let { Map, List, fromJS } = immutable
// PureComponent 元件優化的原理是重寫了shouldComponentUpdate,如果說老的狀態物件昂和新的狀態對戲那個不是一個對戲那個的話才會重新整理頁面
/**
* 1.每一次都要生成一個新的物件, 深克隆是非常消耗記憶體的
*/
class Counter extends PureComponent{
state = {
counter: Map({ number: 0})
}
handleClick = event => {
// 優化的深拷貝,實現了節約記憶體
// let state = _.cloneDeep(this.state) 刪除此行
let amount = this.amount.value ? Number(this.amount.value) : 0
// 新增下邊這個狀態
let newState = { ...this.state, counter: this.state.counter.update('number', val => val + amount)}
this.setState(newState)
}
render () {
console.log('render')
return (
<div>
<p>{this.state.counter.get('number')}</p>
<input ref={input => this.amount = input}/>
<button onClick={this.handleClick}>add</button>
</div>
)
}
}
ReactDOM.render(<Counter></Counter>, document.getElementById('root'));
總結
通過簡單的處理,就會很大程度的提高效能解決
相關推薦
React渲染優化之immutableJS(二)
在上一節實現了簡單的效能優化,但是因為需要一次深拷貝和屬性對比,效能還是不好,遂這裡使用Facebook大神寫的immutable.js進行進一步優化 immutable.js JavaScrip
React渲染優化之immutableJS(三)
在前兩節的基礎上,我們在這節引入react-redux,並在react-redux中使用immutablejs 建立專案 使用create-react-app建立目錄 刪除src目錄下所有檔案
NGINX 優化 之 十二
復用 模式 RoCE 並發連接數 查看 模塊 命令 軟件 ror 一、NGINX 基本安全優化 1、隱藏NGINX軟件版本號信息 [root@localhost nginx2]# curl -I 10.3.151.34 HTTP/1.1 502 Bad Gateway Se
你所要掌握的最簡單基礎的React渲染優化
一、React的渲染機制 要掌握一兩項React-render優化的方法不難,但是非常重要.無論是在實際專案中的一個小細節,還是迎合'面試官'的口味 1.1 觸發Render 我們知道React要更新檢視,必須要觸發Render.而這往往是影響效能最重要的一步(因為操作了dom).而React之所以這麼出色,
Unity優化之GC——(二)合理優化Unity的GC
轉載請標明出處http://www.cnblogs.com/zblade/ 最近有點繁忙,白天干活晚上抽空寫點翻譯,還要運動,所以翻譯工作進行的有點緩慢 =。= PS: 最近重新回來更新了一遍,文章還是需要反覆修改才能寫的順暢,多謝各位的支援 :D
React效能優化之PureComponent 和 memo使用分析
前言 關於react效能優化,在react 16這個版本,官方推出fiber,在框架層面優化了react效能上面的問題。由於這個太過於龐大,我們今天圍繞子自元件更新策略,從兩個及其微小的方面來談react效能優化。 其主要目的就是防止不必要的子元件渲染更新。 子元件何時更新? 首先我們看個例子
遊戲AI(二)—行為樹優化之
getch 改變 解決辦法 over -m 直接 操作 由於 上進 上一篇我們講到了AI架構之一的行為樹,本篇文章和下一篇文章我們將對行為樹進行優化,在本篇文章中我們講到的是內存優化 問題 上一篇中我們設計的行為樹由於直接采用new進行動態內存分配,沒有自己進行管理。因此行
web網站集群之企業級Nginx Web服務優化詳解(二)
監牢模式 優雅顯示 防盜鏈 非法解析 12 配置Nginx gzip壓縮實現性能優化 100k ---- 1s 90k 100k ---- 5s 10k gzip on; gzip_min_length 1k; gzip_buffers
MySQL(二) —— MySQL效能優化之 SQL語句優化
SQL語句優化 MySQL優化的目的 1、避免出現頁面訪問錯誤:或由於資料庫連線超時 timeout 產生頁面5xx錯誤;或由於慢查詢造成頁面無法載入;或由於阻 塞造成資料無法提交;
React總結篇之五_React元件的效能優化
一、單個React元件的效能優化React利用Virtual DOM來提高渲染效能,雖然這能將每次DOM操作量減少到最小,計算和比較Virtual DOM依然是一個複雜的計算過程。如果能夠在計算Virtual DOM之前就能判斷渲染結果不會有變化,那樣可以乾脆不要進行Virtual DOM計算和比較,速度就會
Logistic迴歸之梯度上升優化演算法(二)
Logistic迴歸之梯度上升優化演算法(二) 有了上一篇的知識儲備,這一篇部落格我們就開始Python3實戰 1、資料準備 資料集:資料集下載 資料集內容比較簡單,我們可以簡單理解為第一列X,第二列Y,第三列是分類標籤。根據標籤的不同,對這些資料點進行分類。
JVM原理及優化之二:記憶體管理
1. 記憶體分配策略: 1. 物件優先在Eden分配 2. 大物件直接進入老年代 3. 長期存活物件將進入老年代(當它的年齡增加到一定程度 (預設為15歲 ),就會被晉升到老年代中 。物件晉升老年代的年齡閾值,可以通過引數 -XX:MaxTenuringThreshold來
SQL和PL/SQL的效能優化之二--執行計劃管理
1、提示--它們僅是建議,優化器可以選擇忽略他們。事實上,優化器將盡可能地遵從優化提示,哪怕會導致空難性的效能影響。一般來說,只有當你用盡非直接方法(收集統計資訊,建立柱狀圖及設定配置引數等)之後,才可以考慮使用提示。 下面是一些更常見的提示:
Android進階——效能優化之程序拉活原理及手段完全解析(二)
引言 上一篇文章Android進階——效能優化之程序保活原理及手段完全解析(一)總結了Android程序和執行緒的相關知識,主要介紹了幾種提升程序優先順序的手段,通常僅僅是提高優先順序只能讓你的程序存活時間久一點,但是真正的被殺死之後就不會自動拉活的,如果你的程
MySQL(二) —— MySQL效能優化之 SQL語句優化
SQL語句優化 MySQL優化的目的 1、避免出現頁面訪問錯誤:或由於資料庫連線超時 timeout 產生頁面5xx錯誤;或由於慢查詢造成頁面無法載入;或由於阻 塞造成資料無法提交; 2、增加資料庫的穩定性:避免由於低效查詢
前端效能優化之-css阻塞渲染
為了防止頁面重複渲染頁面,降低瀏覽器效能,瀏覽器在CSSDOM構建完成之前,不會渲染頁面,直觀的感受就是,在css下載完成之前,瀏覽器將出現白屏現象。 瀏覽器渲染流程: 瀏覽器開始解析目標HTML檔案,執行流的順序為自上而下。 HTML解析器將
當代前端應該怎麼寫這個hello world? 從DOM操作看Vue&React的前端元件化,順帶補齊React的demo 【前端優化之拆分CSS】前端三劍客的分分合合
前言 大概16年的時候我們隊react進行了簡單的學習:從DOM操作看Vue&React的前端元件化,順帶補齊React的demo,當時我們只是站在框架角度在學習,隨著近幾年前端的變化,想寫個hello world似乎變得複雜起來,我們今天便一起來看看現代化的前端,應該如何做一個頁面,今天我們學習r
瀏覽器渲染原理(效能優化之如何減少重排和重繪)
繼續上篇《瀏覽器位址列裡輸入URL後的全過程》 前言 為什麼要了解瀏覽器的渲染原理?瞭解瀏覽器的渲染原理有什麼好處?我們做前端開發為什麼非要了解瀏覽器的原理?直接把網頁做出來,什麼需求,直接一把梭,擼完收工不好嗎。 但是經常會有人會問,什麼是重排和重繪? 重排也叫迴流(Re
Linux效能優化之記憶體優化(二)
前言 不知道大家看完前面一章關於CPU優化,是否受到相應的啟發呢?如果遇到任何問題,可以留言和一起探討這方面的問題。接下來我們介紹一些關於記憶體方面的知識。記憶體管理軟體包括虛擬記憶體系統、地址轉換、交換、換頁和分配。與效能密切相關的內容包括:記憶體釋放、空閒連結串列、頁掃描、交換、程序地址空間和記憶體分
React Native入門(十二)之使用第三方字型檔案
前言 專案中需要展示一些別的平面或者其他民族文字時,需要使用該文字對應的字型檔案,一般來說都是.ttf的。 在React Native中,使用字型檔案就是在style中設定fontFamily屬性! 比如,這裡的字型檔案為:FangSong.ttf,那麼使