天天看點

Redux教程3:添加倒計時

前面的教程裡面,我們搭建了一個簡單紅綠燈示例,通過在console輸出當面的倒計時時間;由于界面上不能顯示倒計時,使用者體驗并不良好,本節我們就添加一個簡單的倒計時改善一下。

作為本系列的最後一篇文章,将示例如何處理多個redux、react的情形;

我們定義倒計時的類名為 counter ,建立所需要的檔案(夾):

建立 counter 的 redux 和 react 元件的過程就相當于重複了一下之前兩篇文章的過程,代碼也不複雜,我這邊也就不粘貼了。可自行參考代碼,代碼托管在 https://github.com/boycgit/demos/tree/master/traffic;

可以通過 http://localhost:3000/counter/redux 檢驗是否正常運作;

Redux教程3:添加倒計時

(這個是gif圖,如果沒動畫請點選在新視窗打開)

在假設使用者已經編寫上面的代碼檔案的基礎上,我們繼續講解如何将 counter 和 light 兩個元件聯合起來。

redux的三個原則之一 : 單一store,單一reducer。我們建立兩個檔案,分别整合之前所寫的 reducer 和 store 。

建立 <code>reducers/traffic.js</code>檔案,作為 主reducer 入口檔案:

這裡包含了最佳實踐法則, 将不同的狀态轉移關系寫進不同的js檔案,最後彙總到 index.js 中(這裡名為traffic.js,地位是一樣的) ,比如後期如果多出一種 “汽車的狀态轉移” 關系,隻要建立對應的js檔案,然後再在index.js中的<code>combinereducers</code> 函數中多添加一行配置即可;

詳細的概念及作用請參考redux的中文文檔 reducer

建立 <code>stores/traffic.js</code>檔案,作為 主store 入口檔案:

可以看到并沒有什麼工作量,隻是多了幾行代碼而已;

前面建立的 counter 和 light 算是元件,将兩者結合起來,可以視作一款小應用了(假設應用名為<code>traffic</code>);

為了友善管理,專門建立 app 檔案夾來存放應用,并建立應用相關的等輔助内容(比如視圖等):

核心是 app/traffic/index.js 檔案,其餘檔案隻是其輔助作用,這邊也不重點講解,可自行到git clone後檢視;

在 app/traffic/index.js 中引入 counter 和 light 元件并設定初始化值:

初始化的時候,我們從綠燈開始;

倒計時的時間來自于 initlight.light.time ,這樣在初始化狀态的時候關聯起來兩個元件

将兩個元件的狀态(initlight,initcount)合并成 initstate ,傳給應用的 store,以完成 應用store的初始化

緊接着,使用 connect 方法連結 redux 和 react元件:

形式和上篇提到的類似,細節略微有些不同:

mapstatetoprops中傳回的對象有兩個屬性 light 和 count,在react元件中 對應 this.props.light 、 this.props.count

mapdispatchtoprops 中現将兩個元件的方法先和<code>dispatch</code>綁定,合成一個對象之後再指派,這樣在react元件中使用 this.props.actions 可以調用這兩個元件的所有的actions創造函數;

最後使用 <code>&lt;provider&gt;</code> 注入 store 執行個體;

最後,綁定store之後完善 app類 的代碼,大部分的邏輯和前一篇的類似:

變換的邏輯都在 autochange 方法中

使用 actions.countdown(); 讓倒計時減1,通過 store.getstate();擷取更新後的狀态,因為如果直接使用count.num 擷取的是 更新之前 的狀态;

當 curstate.count.num 小于 0 的時候,調用 this.changecolor(light,actions); 更改紅綠等的顔色,同時将 新的紅綠燈的time值初始化 counter 元件,這樣就完成了兩者的綁定

在 http://localhost:3000/app/traffic 中檢視效果,效果正如此系列文章第一篇開頭所展示的那樣,紅綠燈搭配倒計時運作:

Redux教程3:添加倒計時

紅綠燈初始狀态是 綠燈5s,繼而循環 黃燈3s -&gt; 紅燈7s -&gt; 綠燈5s -&gt; 黃燈3s -&gt; ...

就這樣, counter 和 light 融洽地結合起來,完美,happy ending~

到這裡,redux 的入門教程算是完結;整個過程下來,你可以體會得到,react隻需要關注逐漸的展示就行了,所有狀态的管理交由 <code>redux</code> 即可,這種綁定恰好展現了 容器元件和展示元件相分離 的開發思想: 隻在最頂層元件(如路由操作)裡使用 redux;内部元件應該像木偶一樣保持“呆滞”,所有資料都通過 props 傳入 。

這裡需要再強調一下:redux 和 react 之間沒有關系。redux 支援 react、angular、ember、jquery 甚至純 javascript。

此系列文章僅僅是個開始,後續redux還有許多高階内容需要學習,比如異步資料流等處理。少年,加油吧~

繼續閱讀