immutable 入門基礎
什麼是immutable
-
immutable(不可改變的)
immutable是一種持久化資料。一旦被建立就不會被修改。修改immutable物件的時候返回新的immutable。但是原資料不會改變。
原理:持久化資料結構
為什麼要使用immutable
在Rudux中因為深拷貝對效能的消耗太大了(用到了遞迴,逐層拷貝每個節點)。
但當你使用immutable資料的時候:只會拷貝你改變的節點,從而達到了節省效能。
總結:immutable的不可變性讓純函式更強大,每次都返回新的immutable的特性讓程式設計師可以對其進行鏈式操作,用起來更方便。
20181122144653609.gifimmutable的簡單實用
初始化
安裝:cnpm i immutable -S
本篇文章只介紹一些常用API,以及兩種常用的immutable資料結構:Map和List
Map資料結構
immutable.Map():建立一個類似於js中的物件的Map物件
let map = immutable.Map({
name:"Apple",
age:19,
sex:"男"
})
console.log(map); // Map { "name":"Apple", "age":19, "sex":"男" }
操作Map:
-
增
map.set
let map1 = map.set("sign","嗚嗚") console.log(map1); // Map { "name":"Apple", "age":19, "sex":"男", "sign":"嗚嗚" }
map.setIn
let map1 = map.setIn(["obj","xxx"],"xxx") // 深層的set console.log(map1); // Map { "name":"Apple", "age":19, "sex":"男", "obj":{ "xxx":"xxx" } }
注意:setIn可以深層操作,第一個引數是個陣列,陣列中第一個元素是操作的物件的key值,第二個元素是value值,如果不需要可以不用。以下的map.deleteIn、map.updateIn、map.getIn同理。
-
刪
map.delete('a') // 刪除 a 的值 map.deleteIn(['a', 'b']) // 刪除 a 中 b 的值
-
改
map.update()
引數1:需要更新的值
引數2:回撥函式,返回一個更新後的值
map.updateIn() 深層更新
引數1:一個數組,第一個元素是父元素,第二個元素為目標子元素
引數2:回撥函式,引數為目標值的值,返回值為一個更新後的值
let map1 = map.update('a',function(x){return x+1}) let map2 = map.updateIn(['a', 'b'],function(x){return x+1})
-
查
返回的不是immutable物件了 而是裡邊定義的正常值
map.get('a') // {a:1} 得到1。 map.getIn(['a', 'b']) // {a:{b:2}} 得到2。
List資料結構:
immutable.List():建立一個類似於js中的陣列的List物件
let list = immutable.List([1,2,3,4,5])
-
增
list.push(6) list.splice(0,0,10)
用法和js的push一樣,但是返回值為immutable的List結構,而不是陣列
-
刪
list.splice(1,1)
-
改
list.splice(1,1,10)
-
查
list.getIn([0])
API
-
merge():合併map物件
let newMap = map.merge(map1)
-
toObject():immutable的map物件轉JS物件
淺轉換,只轉換最外層
-
toArray():immutable的list物件轉JS陣列
淺轉換,只轉換最外層
-
toJS():immutable的 map物件/list物件 轉 JS物件/JS陣列
深轉換,全部轉換,更耗費效能。
-
Map():JS物件或陣列轉換成immutable
淺轉換,只轉換最外層
-
fromJS():JS物件/JS陣列 轉換成immutable
深轉換,全部轉換,更耗費效能。