创建项目

1、全局安装脚手架:
$ npm install -g create-react-app
2、通过脚手架搭建项目:
$ create-react-app <项目名称>
3、开始项目:
$ cd <项目名>
$ npm run start
 

使用 React-Redux

1、安装
 
npm install –save react-redux
或者
yarn add react-redux
 

创建Store

 

首先我们需要让store成为我们app中可访问的对象。为此,我们将用React-Redux提供给我们的<Provider/>组件包裹我们的根组件
1、创建redux文件夹
2、添加reducers(也可以叫其他名字,名字随便定义,不是固定的)
为了把 action 和 state 串起来,开发一些函数,这就是 reducer。reducer 只是一个接收 state 和 action,并返回新的 state 的函数。对于大的应用来说,不大可能仅仅只写一个这样的函数,所以我们编写很多小函数来分别管理 state 的一部分:
 

 
3、添加store文件js
 

 
4、引入store
 

 

连接组件

 

React-Redux提供一个connect方法使你可以从Redux store中读取数据(以及当store更新后,重新读取数据)
connect方法接收两个参数,都是可选参数:
mapStateToProps:每当store state发生变化时,就被调用。接收整个store state,并且返回一个该组件所需要的数据对象
mapDispatchToProps:这个参数可以是一个函数或对象
如果是一个函数,一旦该组件被创建,就会被调用。接收dispatch作为一个参数,并且返回一个能够使用dispatch来分发actions的若干函数组成的对象
如果是一个action creators构成的对象,每一个action creator将会转化为一个prop function并会在调用时自动分发actions。注意: 我们建议使用这种形式。
通常,你可以这样去connect:
 
它接收的第一个参数是state,可选的第二个参数是 ownProps,然后返回一个被连接组件所需要的数据的纯对象。
 

 

实现

 

Action 本质上是一个 JavaScript 普通对象。我们约定,action 内必须使用一个字符串类型的 type 字段来表示将要执行的动作。多数情况下,type 会被定义成字符串常量。当应用规模越来越大时,建议使用单独的模块或文件来存放 action。除了 type 字段外,action 对象的结构完全由你自己决定。
 
1、添加actionType.js
 
 
2、添加action.js,(Action 创建函数)
 

 
3、把创建好的 addTodo action 传递到 connect,我们的组件就能够以一个 prop 接收到它。并且一旦我们调用,它就能够自动的分发actions。
 

到这一步,我们的 <AddTodo/> 已经连接到了store,当我们增加一个新的todo时,虽然还看不到效果(因为别的组件尚未连接到 store),但我们可以看到,控制台已经打印了内容 ‘ADD_TODO’,说明确实执行了 addTodo action。如果你安装了 Redux DevTools 谷歌浏览器扩展程序,那么你可以看到 action 已经被分发了。接下来,只要我们吧 odoList 也连接上,就可以看到效果了。
 
4、连接 TodoList
 
<TodoList/> 组件负责渲染 todos 列表。因此,他需要从 store 中读取数据。我们通过调用 connect 方法,并向其中传入 mapStateToProps 参数从而提供给组件所需要的部分来自 store 数据。

这个时候,我们已经连接了 TodoList 组件,当我们通过点击按钮增加一个新的 todo 时,TodoList 已经有了变化。
 
5、过滤 todo
 
我们的 <Todo/> 组件接收一个 todo 项作为 prop。我们从 todos 的 btIds 对象获取到所需信息。然而,我们也需要 store 中的 allIds 字段的信息,以便指明哪些 todos 以哪种顺序渲染。
我们可以添加一个 selector.js 文件,专门用来过滤todo

在 TodoList 中,我们只需要简单地导入selector并且使用它。

6、实现VisibilityFilters功能。
 
<VisiblityFilterse/> 组件需要从 store 中读取当前选中的过滤条件,并且分发 actions。因此,我们需要把 mapStateToProps 以及 mapDispatchToProps 都传递给 connect 方法。mapStateToProps 能够作为 visiblityFilter 状态的一个简单的访问器。mapDispatchToProps 会包括 setFilteraction 创建函数。
首先添加actions

修改过滤器

同时,我们也要更新我们的<TodoList/>组件来根据筛选条件过滤todos。先前我们传递给<TodoList/> connect 方法的mapStateToProps正如一个简单的选择了所有列表中的todos的selector。现在我们来写一个selector以通过todos的状态来进行筛选。

然后借助selector连接到store

 
7、实现 toggleTodo 功能。
 
首先添加 toggleTodo actions

修改 todo,通过 ownProps 接收从 TodoList 传递过来的 todoId

修改 TodoList,给 Todo 传递参数 todoId
 
至此,全部功能完成。最后,附上完整demo地址:https://github.com/lilaobiao/react-redux-demo