React NativeReact NativeReact Native

在react-native中使用redux

2016-04-29  本文已影响45707人  巨巨

[2017-02-17 Update,github上代码的RN版本已更新至最新版本(0.41.2),如有问题请提issue,3Q]

redux是什么?

redux是一个用于管理js应用状态的容器。redux出现时间并不是很长,在它出现之前也有类似功能的模块出现,诸如flux等等。redux设计的理念很简单,似乎最初这个开发团队就有让redux可以方便融入在server, browser, mobile client端的打算。目前在github上redux-*的第三方中间件、插件越来越多。如果react项目中想使用redux,那么就有react-redux插件来完成配合。而作为开发者,可以使用这些优秀的第三方资源来开发/优化已有的项目,也是一件很欢乐的事。

设计的动机

在redux.js.org里有关于编写redux的动机描述(our code must manage more state than ever before),在现实的生活中,单页应用越来越多,而且需要维护的状态也越来越复杂,诸如维护数据更新、UI更新、本地数据存储等这些都是我们在js应用常常需要处理的情景,当然这里多数都会涉及到异步处理。而redux本身就是为了解决这些问题,而是将所有的变化进行统一流程处理,会使我们的程序状态变化清晰可见。redux最终目的就是让状态(state)变化变得可预测。

使用的三原则

在上面的三原则中,我们看到了store, action, reducer这些词,那就先说说redux是怎么进行应用状态(state)维护管理的呢。

redux状态管理的流程

上图简单画了下redux状态改变的流程。action -> reducer -> 新store -> 反馈到UI上有所改变
下面再给个具体实例:

redux登录实例.png

store用于维护状态的容器,包括了应用的多个状态,比如说用户是否登录、用户信息、用户任务等等。action是一个普通对象,用于指明是哪种操作,这样才能在reducers中进行识别。而众多reducer是负责返回新的state的函数。在实际应用中,你需要将store或store的某个值绑定到界面,这样更新store的时候,该页面可以监听到值的更新,然后进行一些页面更新操作/跳转操作等。

redux在实际使用中需要用到的高级部分

redux设计如此简洁,以至于并没有进行异步处理的功能。但是留下了middleware这个概念。可以自己编写符合需要的中间件。目前第三方的中间件基本可以完成一个复杂应用的架构设计。那就先说一说,怎么去处理异步请求呢。
首先推荐redux-thunk,可以看到它的源码很简洁。就是判断action是否是函数,如果是函数进行递归式的操作。所以在redux中的异步,只能出现在action中,而且还需要有中间件的支持。

 export default function thunkMiddleware({ dispatch, getState }) {
       return next => action => {
          if (typeof action === 'function') {
              return action(dispatch, getState);
          }
        return next(action);
      };
 }
// redux-thunk的源码

同步action与异步action最大的区别是:
同步只返回一个普通action对象。而异步操作中途会返回一个promise函数。当然在promise函数处理完毕后也会返回一个普通action对象。thunk中间件就是判断如果返回的是函数,则不传导给reducer,直到检测到是普通action对象,才交由reducer处理。

实例说说redux的使用。

实例代码在github上查看地址。该实例只演示了登录过程,是比较基础的redux使用案例。

目录结构

项目相关代码均在js目录下。目录中可以看到actions, reducers, store等子目录。

实例action

actions/user.js

actions/user.js目录中定义了用户登录操作的action creator

实例reducer

reducers/user.js

reducers/user.js中:

reducers/index.js

reducers/index.js中:

实例store

再来看看store的处理:

store/index.js

store/index.js中定义了store的行为(包括中间件):

程序入口

上面是定义。下面再来看如何在程序中使用:

程序入口index.js
在入口文件index.js中:

那就来看看root.js里的内容。

root.js
root.js中:

登录页面。

那再看看登录页面pages/login.js中的用户操作:

pages/login.js - 1 pages/login.js - 2 pages/login.js - 3

上面的3个图片是整个pages/login.js的源码。

看下最终的demo交互效果。

demo交互效果

推荐:
RNTools是一个分享React Native文章、实例代码以及第三方模块的平台。RNTools官网链接 RNTools应用下载

上一篇 下一篇

猜你喜欢

热点阅读