天天看点

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还有许多高阶内容需要学习,比如异步数据流等处理。少年,加油吧~

继续阅读