1. 程式人生 > 實用技巧 >immutable 入門基礎

immutable 入門基礎

什麼是immutable

  • immutable(不可改變的)

    immutable是一種持久化資料。一旦被建立就不會被修改。修改immutable物件的時候返回新的immutable。但是原資料不會改變。

原理:持久化資料結構

為什麼要使用immutable

在Rudux中因為深拷貝對效能的消耗太大了(用到了遞迴,逐層拷貝每個節點)。

但當你使用immutable資料的時候:只會拷貝你改變的節點,從而達到了節省效能。

總結:immutable的不可變性讓純函式更強大,每次都返回新的immutable的特性讓程式設計師可以對其進行鏈式操作,用起來更方便。

20181122144653609.gif

immutable的簡單實用

初始化

安裝: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:

  1. 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同理。

  1. map.delete('a') // 刪除 a 的值
    map.deleteIn(['a', 'b']) // 刪除 a 中 b 的值
    
  2. 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})
    
  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])
  1. list.push(6)
    
    list.splice(0,0,10)
    

    用法和js的push一樣,但是返回值為immutable的List結構,而不是陣列

  2. list.splice(1,1)
    
  3. list.splice(1,1,10)
    
  4. 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

    深轉換,全部轉換,更耗費效能。