React-Redux-Appointment
这个小应用使用Create React App创建,演示地址:https://liliang-cn.github.io/react_redux_appointment,repo地址:https://github.com/liliang-cn/react_redux_appointment。
这是之前的React_appointment的Redux版,之前的演示,改写自Lynda的课程Building a Web Interface with React.js。
文件结构
最终的文件目录如下:
1 | react_redux_appointment/ |
用到的模块
1 | { |
所有的state
小应用一共有六个状态,其中的formExpanded和openDialog是界面组件的状态,
剩下的四个分别是apts(代表所有的预约)、orderBy(根据什么来排列预约列表,根据姓名还是根据日期)、
orderDir(排列列表的方向,是增序还是降序)、query(搜索的关键字)。
所有的Action
在应用中可能产生的actions有七种:
- addApt,即新建预约
- deleteApt, 即删除预约
- toggleDialog, 即显示、隐藏警告框
- toggleFormExpanded, 显示/隐藏表单
- query,即查询
- changeOrderBy,即改变排序的关键字
- changeOrderDir, 即改变排序方向
定义七个常量来代表这些action的类型:
constants/index.js
:
1 | export const ADD_APT = 'ADD_APT'; |
actions/index.js
:
1 |
|
UI组件
样式
使用Material-UI需要引入Roboto字体:
src/index.css
1 | @import url('https://fonts.googleapis.com/css?family=Roboto:300,400,500'); |
表单组件
components/addForm.js
:
1 | import React from 'react'; |
搜索表单
components/Search.js
:
1 | import React from 'react'; |
排列选择
components/Sort.js
:
1 | import React from 'react'; |
预约列表
这个组件的作用就是显示预约列表,接受父组件传来的apts数组和handleDelete函数,在点击RaisedButton的时候将apt.id传入handleDelete并执行。
components/AptList.js
:
1 | import React from 'react'; |
处理不同的actions
处理表单的显示和隐藏
reducers/formExpanded.js
:
1 | import { TOGGLE_FORM_EXPANDED } from '../constants'; |
表单验证错误的提示对话框
reducers/openDialog.js
:
1 | import { TOGGLE_DIALOG } from '../constants'; |
处理新建预约和删除预约
reducers/apts.js
:
1 | import { ADD_APT, DELETE_APT } from '../constants'; |
查询和排列方式
这三个函数的作用就是根据action传入的数据,更新state里的对应值,在这里并不会真正的去处理预约的列表。
reducers/orderBy.js
:
1 | import { CHANGE_ORDER_BY } from '../constants'; |
reducers/orderDir.js
:
1 | import { CHANGE_ORDER_DIR } from '../constants'; |
reducers/query.js
:
1 | import { QUERY } from '../constants'; |
合成reducers
reducers/index.js
:
1 | import { combineReducers } from 'redux'; |
容器组件
containers/AddForm.js
:
1 | import { connect } from 'react-redux'; |
containers/App.js
:
1 | import React from 'react'; |
入口文件
src/index.js
:
1 | import React from 'react'; |
结尾
React提供的是通过state来控制控制UI和单向数据流动,
Redux提供的是单一数据源和只能通过action和reducer来处理state的更新。
以其中的点击按钮显示新建预约表单的过程来捋一捋React、React-Redux的逻辑(灵感来源于自Cory House大神):
- 用户:点击按钮
- React:哈喽,action生成函数toggleFormExpanded,有人点击了展开新建预约的表单。
- Action: 收到,谢谢React,我马上发布一个action也就是{type: TOGGLE_FORM_EXPANDED}告诉reducers来更新state。
- Reducer: 谢谢Action,我收到你的传过来要执行的action了,我会根据你传递进来的{type: TOGGLE_FORM_EXPANDED},先复制一份当前的state,然后把state中的formExpanded的值更新为true,然后把新的state给Store。
- Store:嗯,Reducer你干得漂亮,我收到了新的state,我会通知所有与我连接的组件,确保他们会收到新state。
- React-Redux:啊,感谢Store传来的新数据,我现在就看看React界面是否需要需要发生变化,啊,需要把新建预约的表单显示出来啊,那界面还是要更新一下的,交给你了,React。
- React:好的,有新的数据由store通过props传递下来的数据了,我会马上根据这个数据把新建预约的表单显示出来。
- 用户:看到了新建预约的表单。
如果觉得还不错,来个star吧。(笑脸)