Immutable.js詳解
這次帶給大家Immutable.js詳解,使用Immutable.js的注意事項有哪些,下面就是實戰案例,一起來看一下。
Immutable.js在react + router + redux專案中的應用
先介紹一下Immutable:
Immutable.js的出現源自於Functional Programming的思想,即所有資料應該是複製過來,而不是直接修改。相關介紹看它官網:
https://facebook.github.io/immutable-js/
所以如果你有一些程式設計經驗,可以理解為Immutable就是另外一個資料結構的庫。就好像從ArrayList換成LinkedList一樣。在Immutable.js下,就是從JavaScript語法自有的Array(就是[])和Object({ }),換到Immutable.List和Immutable.Map了。
但是ArrayList和LinkedList畢竟都繼承於List,介面上比較一致,換起來問題不大,但是想用Immutable換JavaScript原生,就要略複雜些。
var map1 = Immutable.Map({a:1, b:2, c:3});var map2 = map1.set('b', 50); map1.get('b'); // 2/* ----------------悠长悠长的分割线---------------- */var list1 = Immutable.List.of(1, 2);var list2 = list1.push(3, 4, 5);var list3 = list2.unshift(0);var list4 = list1.concat(list2, list3);
複雜歸複雜,不過是多注意一點吧。
然後要說到redux和router
Redux有一個combineReducers方法,可以做到Reducer的拆分。例如:
combineReducers({ user: userReducer, dashboard: dashboardReducer, })
那麼問題來了:
當你取得state的時候,你是用state.get('user')還是用state.user?
顯然要用state.user。因為combineReducers不認識Immutable啊。
(不要告訴我混用,一層結構可以這樣,多層呢?多人合作呢?一處蒙逼,處處報錯啊)
所以如果你想在一個react + router + redux的專案下用Immutable,要嘛就局部使用(局部的話,基本上會很nightmare吧),要嘛就換全套的。
然後就是看這裡(這哥們把combineReducers給重新寫了):
https://github.com/gajus/redux-immutable
用他們家的combineReducers,你可以放心地用state.get('user')。
在解決combineReducers的同時,他們家還順帶解決了react-router-redux的問題(試想router作為state下的routing模組卻不懂用Immutable該多呵呵):
https://github.com/gajus/redux-immutable#using-with-react-router-redux
說了這麼多,怎麼用呢
首先你的專案是react + router + redux的標配。
然後你要引入Immutable。
那麼你該這樣:
引入redux-immutable
按照redux-immutable的README.md把history什麼的配置好(Ctrl+C, Ctrl+V)
所有reducer合併的時候換用redux-immutable的combineReducers
所有資料出入state用Immutable.js的Immutable.List和Immutable.Map(這才是正題)
還有什麼要注意的嗎?
元件的問題:
從redux過來的想法是把元件分成Smart和Dumb。 Smart元件負責把數據接進來,Dumb元件負責使用數據,並且只專注於props。所以Immutable要覆蓋Smart和Dumb嗎?
我個人觀點是這樣的:
Dumb元件基本上都是要抽像出來給多個項目共用的。這部分組件不支援Immutable應該會更好些,否則就被綁死在Immutable上了。
那這麼說,Dumb裡的資料是JavaScript原生的,豈不是享受不到Immutable帶來的好處?
資料已經複製給了元件,為了相容性犧牲一點這個也沒啥吧?
這個想法背後的結論就是:
redux概念裡的Container在做state與props之間,props與dispatch之間的對接的時候,也同時做了Immutable與原生的相互轉換。 (Adapter Pattern吧)
測試的時候:
你會想console.log一下目前的資料吧,把Immutable.List打出來看著很累的,建議用console.log (imtb.toJS())
可是debug的時候呢?
題外話
如果這些特性是JavaScript本身內建的就好了。
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
相關閱讀:
一個用Vue.js 2.0+做出的石墨文檔樣式的富文本編輯器
以上是Immutable.js詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Windows作業系統是全球最受歡迎的作業系統之一,其新版本Win11備受矚目。在Win11系統中,管理員權限的取得是一個重要的操作,管理員權限可以讓使用者對系統進行更多的操作和設定。本文將詳細介紹在Win11系統中如何取得管理員權限,以及如何有效地管理權限。在Win11系統中,管理員權限分為本機管理員和網域管理員兩種。本機管理員是指具有對本機電腦的完全管理權限

OracleSQL中的除法運算詳解在OracleSQL中,除法運算是一種常見且重要的數學運算運算,用來計算兩個數相除的結果。除法在資料庫查詢中經常用到,因此了解OracleSQL中的除法運算及其用法是資料庫開發人員必備的技能之一。本文將詳細討論OracleSQL中除法運算的相關知識,並提供具體的程式碼範例供讀者參考。一、OracleSQL中的除法運算

PHP中的模運算子(%)是用來取得兩個數值相除的餘數的。在本文中,我們將詳細討論模運算子的作用及用法,並提供具體的程式碼範例來幫助讀者更好地理解。 1.模運算子的作用在數學中,當我們將一個整數除以另一個整數時,就會得到一個商和一個餘數。例如,當我們將10除以3時,商數為3,餘數為1。模運算子就是用來取得這個餘數的。 2.模運算子的用法在PHP中,使用%符號來表示模

Linux系統呼叫system()函數詳解系統呼叫是Linux作業系統中非常重要的一部分,它提供了一種與系統核心互動的方式。其中,system()函數是常用的系統呼叫函數之一。本文將詳細介紹system()函數的使用方法,並提供對應的程式碼範例。系統呼叫的基本概念系統呼叫是使用者程式與作業系統核心互動的一種方式。使用者程式透過呼叫系統呼叫函數來請求作業系統

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

Linux的curl命令詳解摘要:curl是一種強大的命令列工具,用於與伺服器進行資料通訊。本文將介紹curl指令的基本用法,並提供實際的程式碼範例,幫助讀者更好地理解和應用該指令。一、curl是什麼? curl是命令列工具,用於發送和接收各種網路請求。它支援多種協議,如HTTP、FTP、TELNET等,並提供了豐富的功能,如檔案上傳、檔案下載、資料傳輸、代

Promise.resolve()詳解,需要具體程式碼範例Promise是JavaScript中一種用來處理非同步操作的機制。在實際開發中,常常需要處理一些需要依序執行的非同步任務,而Promise.resolve()方法就是用來傳回一個已經Fulfilled狀態的Promise物件。 Promise.resolve()是Promise類別的靜態方法,它接受一個

Numpy是一款Python科學計算庫,提供了豐富的陣列操作函數與工具。升級Numpy版本時需要查詢目前版本以確保相容性,本文將詳細介紹Numpy版本查詢的方法,並提供具體的程式碼範例。方法一:使用Python程式碼查詢Numpy版本使用Python程式碼可以輕鬆查詢Numpy的版本,以下是實作方法和範例程式碼:importnumpyasnpprint(np
