react-redux 初試之todo list

最近在學(xué)react挤渔,官方的英文文檔看起來甚是有意思,但 talk is cheap, show me the code。所以先手?jǐn)]一個 todo list骡男,后面再升級引入 react-redux,便于狀態(tài)管理傍睹。
todoList的功能如下:
(1)用戶可輸入新的內(nèi)容隔盛,點(diǎn)擊 "Add todo"添加,默認(rèn)初始狀態(tài)是未完成(incomplete)拾稳;
(2)用戶通過勾選待做事項(xiàng)前的方框吮炕,將該事項(xiàng)標(biāo)記為完成狀態(tài)(completed);
(3)用戶通過底部三個按鈕访得,可按事項(xiàng)的完成狀態(tài)分類別查看龙亲。
這個應(yīng)用麻雀雖小五臟俱全陕凹,效果圖如下。

fig1

fig2

fig3

在開始寫代碼實(shí)現(xiàn)之前鳄炉,一定要先分析好業(yè)務(wù)邏輯杜耙,再結(jié)合UI取拆分組件,尤其要考慮好 state拂盯、props 中的數(shù)據(jù)以及它們所在的組件層級佑女,要遵守 react 的設(shè)計(jì)思想。
這里定義了五個組件谈竿,TodoApp团驱、AddTodo、TodoList榕订、Todo店茶、VisibilityFilters,介紹如下:
(1)TodoApp:應(yīng)用的入口組件劫恒,層級最高贩幻,AddTodo、TodoList两嘴、VisibilityFilters 都在這里進(jìn)行渲染(render)丛楚。
(2)AddTodo:包含一個輸入框(input)和一個“Add todo ”按鈕,以便用戶添加待做事項(xiàng)(todo)憔辫。
(3)TodoList :是 Todo 組件的父級組件趣些,展示由 Todo 組件構(gòu)成的事項(xiàng)列表,不過僅展示符合 VisibilityFilters 組件中確定的當(dāng)前過濾條件的事項(xiàng)贰您。
(4)Todo:渲染單個事項(xiàng)坏平,每個事項(xiàng)內(nèi)容前面有復(fù)選框供用戶點(diǎn)擊標(biāo)記事項(xiàng)的完成狀態(tài)。
(5)VisibilityFilters:渲染決定事項(xiàng)是否顯示的過濾條件锦亦,用戶可點(diǎn)擊設(shè)置舶替。
組件的定義、功能杠园、層級關(guān)系以及用戶交互致使?fàn)顟B(tài)改變的地方都已說明完畢顾瞪,代碼較多就不貼了,要看請點(diǎn)這里
抛蚁,歡迎指正陈醒。(純手?jǐn)],只使用了 react 本身的狀態(tài)管理瞧甩、數(shù)據(jù)流動機(jī)制钉跷,未引入 redux),盡管要實(shí)現(xiàn)的功能并不復(fù)雜亲配,但是這里面的狀態(tài)管理已經(jīng)不簡單了尘应。
下面將引入redux惶凝,在借助 redux 進(jìn)行狀態(tài)管理后吼虎,組件本身的代碼就簡潔多了犬钢,因?yàn)闋顟B(tài)相關(guān)邏輯代碼被提取放置到專門的文件中,如下圖所示的 redux 文件目錄思灰。
專門負(fù)責(zé)狀態(tài)管理的 redux 文件

現(xiàn)在簡要介紹下redux 部分的組織結(jié)構(gòu):
(1)Store: 可視為狀態(tài)(state)的容器玷犹,本應(yīng)用的 state 有: todos,visibilityFilters洒疚,這部分代碼很少歹颓,主要處理在 reducers 中。
(2)Action Creators:狀態(tài)(state)是通過發(fā)送(dispatch)動作(action)來間接改變的油湖,Action Creators 這部分對應(yīng) action.js 文件巍扛,用來生成動作(action),本應(yīng)用中的動作有 ADD_TODO乏德、TOGGLE_TODO撤奸、SET_FILTER,以下是 ADD_TODO 的示例喊括,addTodo 函數(shù)是 action creator胧瓜,返回的對象就是一個 action(由類型,有效內(nèi)容定義)郑什。

export const addTodo = content => ({
  type: ADD_TODO,
  payload: {
    id: ++nextTodoId,
    content
  }
});

(3)Reducers:這部分用來具體規(guī)定 動作(action)如何改變 狀態(tài) (state)府喳,注意對整體狀態(tài)作劃分處理,如下 visibilityFilter reducer 只負(fù)責(zé) visibilityFilter 這部分狀態(tài)蘑拯。

const initialState = VISIBILITY_FILTERS.ALL;
const visibilityFilter = (state = initialState, action) => {
  switch (action.type) {
    case SET_FILTER: {
      return action.payload.filter;
    }
    default: {
      return state;
    }
  }
};

(4)Selectors:select from store combining information from multiple reducers钝满,比較負(fù)責(zé)的狀態(tài)數(shù)據(jù)選擇邏輯放這里會使得代碼更加清晰可維護(hù)。
通過 connect 函數(shù)讓組件與 store 連接申窘,該函數(shù)可傳入兩個可選參數(shù) mapStateToProps 和 mapDispatchToProps 弯蚜,這兩個參數(shù)的全稱很好地詮釋了它們的作用,前者是從整體 state 狀態(tài)中取出被連接的組件需要的部分(組件被動接收狀態(tài))偶洋,后者賦予組件(及其內(nèi)部子孫組件熟吏,即使子孫組件未通過 connect函數(shù)與全局 state 連接)改變 state 的能力(組件主動改變狀態(tài)),前者要傳入的部分狀態(tài)(如以下示例中的 todos)與后者要傳入的 dispatch 函數(shù)(以下示例中的 toggleTodo)玄窝,在被連接組件(TodoList)中都是通過 props 來獲取牵寺。

export default connect(
  state=>({todos:getTodosByVisibilityFilter(state)}), // mapStateToProps
  {toggleTodo} // mapDispatchToProps
)(TodoList)

被連接的組件(<TodoList>)在 react 組件結(jié)構(gòu)中被嵌套在 <Connect(TodoList)>組件中,在chrome中通過 React 開發(fā)者工作查看如下:


react中的組件嵌套結(jié)構(gòu)

全部代碼

reference:
1
[2] react 官網(wǎng)文檔
[3] redux 官網(wǎng)文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恩脂,一起剝皮案震驚了整個濱河市帽氓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俩块,老刑警劉巖黎休,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浓领,死亡現(xiàn)場離奇詭異,居然都是意外死亡势腮,警方通過查閱死者的電腦和手機(jī)联贩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捎拯,“玉大人泪幌,你說我怎么就攤上這事∈鹫眨” “怎么了祸泪?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長建芙。 經(jīng)常有香客問我没隘,道長,這世上最難降的妖魔是什么禁荸? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任右蒲,我火速辦了婚禮,結(jié)果婚禮上屡限,老公的妹妹穿的比我還像新娘品嚣。我一直安慰自己,他們只是感情好钧大,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布翰撑。 她就那樣靜靜地躺著,像睡著了一般啊央。 火紅的嫁衣襯著肌膚如雪眶诈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天瓜饥,我揣著相機(jī)與錄音逝撬,去河邊找鬼。 笑死乓土,一個胖子當(dāng)著我的面吹牛宪潮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趣苏,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼狡相,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了食磕?” 一聲冷哼從身側(cè)響起尽棕,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彬伦,沒想到半個月后滔悉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伊诵,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年回官,在試婚紗的時候發(fā)現(xiàn)自己被綠了曹宴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡孙乖,死狀恐怖浙炼,靈堂內(nèi)的尸體忽然破棺而出份氧,到底是詐尸還是另有隱情唯袄,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布蜗帜,位于F島的核電站恋拷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厅缺。R本人自食惡果不足惜蔬顾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望湘捎。 院中可真熱鬧诀豁,春花似錦、人聲如沸窥妇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽活翩。三九已至烹骨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間材泄,已是汗流浹背沮焕。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拉宗,地道東北人峦树。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像旦事,于是被迫代替她去往敵國和親魁巩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容