react-redux 初试之todo list

最近在学react,官方的英文文档看起来甚是有意思,但 talk is cheap, show me the code。所以先手撸一个 todo list,后面再升级引入 react-redux,便于状态管理。
todoList的功能如下:
(1)用户可输入新的内容,点击 "Add todo"添加,默认初始状态是未完成(incomplete);
(2)用户通过勾选待做事项前的方框,将该事项标记为完成状态(completed);
(3)用户通过底部三个按钮,可按事项的完成状态分类别查看。
这个应用麻雀虽小五脏俱全,效果图如下。

fig1

fig2

fig3

在开始写代码实现之前,一定要先分析好业务逻辑,再结合UI取拆分组件,尤其要考虑好 state、props 中的数据以及它们所在的组件层级,要遵守 react 的设计思想。
这里定义了五个组件,TodoApp、AddTodo、TodoList、Todo、VisibilityFilters,介绍如下:
(1)TodoApp:应用的入口组件,层级最高,AddTodo、TodoList、VisibilityFilters 都在这里进行渲染(render)。
(2)AddTodo:包含一个输入框(input)和一个“Add todo ”按钮,以便用户添加待做事项(todo)。
(3)TodoList :是 Todo 组件的父级组件,展示由 Todo 组件构成的事项列表,不过仅展示符合 VisibilityFilters 组件中确定的当前过滤条件的事项。
(4)Todo:渲染单个事项,每个事项内容前面有复选框供用户点击标记事项的完成状态。
(5)VisibilityFilters:渲染决定事项是否显示的过滤条件,用户可点击设置。
组件的定义、功能、层级关系以及用户交互致使状态改变的地方都已说明完毕,代码较多就不贴了,要看请点这里
,欢迎指正。(纯手撸,只使用了 react 本身的状态管理、数据流动机制,未引入 redux),尽管要实现的功能并不复杂,但是这里面的状态管理已经不简单了。
下面将引入redux,在借助 redux 进行状态管理后,组件本身的代码就简洁多了,因为状态相关逻辑代码被提取放置到专门的文件中,如下图所示的 redux 文件目录。
专门负责状态管理的 redux 文件

现在简要介绍下redux 部分的组织结构:
(1)Store: 可视为状态(state)的容器,本应用的 state 有: todos,visibilityFilters,这部分代码很少,主要处理在 reducers 中。
(2)Action Creators:状态(state)是通过发送(dispatch)动作(action)来间接改变的,Action Creators 这部分对应 action.js 文件,用来生成动作(action),本应用中的动作有 ADD_TODO、TOGGLE_TODO、SET_FILTER,以下是 ADD_TODO 的示例,addTodo 函数是 action creator,返回的对象就是一个 action(由类型,有效内容定义)。

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

(3)Reducers:这部分用来具体规定 动作(action)如何改变 状态 (state),注意对整体状态作划分处理,如下 visibilityFilter reducer 只负责 visibilityFilter 这部分状态。

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,比较负责的状态数据选择逻辑放这里会使得代码更加清晰可维护。
通过 connect 函数让组件与 store 连接,该函数可传入两个可选参数 mapStateToProps 和 mapDispatchToProps ,这两个参数的全称很好地诠释了它们的作用,前者是从整体 state 状态中取出被连接的组件需要的部分(组件被动接收状态),后者赋予组件(及其内部子孙组件,即使子孙组件未通过 connect函数与全局 state 连接)改变 state 的能力(组件主动改变状态),前者要传入的部分状态(如以下示例中的 todos)与后者要传入的 dispatch 函数(以下示例中的 toggleTodo),在被连接组件(TodoList)中都是通过 props 来获取。

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

被连接的组件(<TodoList>)在 react 组件结构中被嵌套在 <Connect(TodoList)>组件中,在chrome中通过 React 开发者工作查看如下:


react中的组件嵌套结构

全部代码

reference:
1
[2] react 官网文档
[3] redux 官网文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容