• 技术文章 >web前端 >js教程

    在ReactNative中如何使用Redux架构

    亚连亚连2018-06-20 16:23:30原创636
    本篇文章主要介绍了ReactNative中使用Redux架构总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    本文介绍了ReactNative中使用Redux架构总结,分享给大家。具体如下:

    使用Redux也有一段时间了。总结一下。

    为什么要使用Redux?

    背景:

    1. RN的state(可变,子组件不可见)和props(不可变,子组件可见)的设计,在面对大型项目时候,容易因为不经意修改state造成状态混乱,组件渲染错误

    2. RN使用了Virtual DOM,不需要Target绑定->Action修改UI属性,只要当状态变化,render新状态下的组件,数据单向传递,而MVC的设计模式存在双向数据流。

    3. RN不易进行测试,Redux提供了非常方便的mock测试方式。

    Redux开发

    开发环境

    1. 安装Redux: ‘npm install –save redux'

    2. 安装React Native和Redux绑定库:npm install –save react-redux

    3. 安装Redux Thunk异步Action中间件:npm install –save redux-thunk

    三个原则

    单一数据源

    整个应用的 state 被储存在一个对象树中,对象树存在于唯一的 store 中。store中的 state 绑定到组件

    State 是只读的

    惟一改变 state 的方法就是触发 action。action 是一个含有 type 属性的普通JS对象,type 可以用常量表示事件。

    使用纯函数来执行修改

    编写 reducers 来描述对应action如何修改 state 。一般可以用 switch(action.type) 来处理,无副作用

    使用

    react-redux提供了connect和Provider。

    1.Provider是顶层的分发点,属性就是Store,将State分发给所有被connect的组件

    2.connect:接受两个参数:一个是mapStateToProps或者mapDispatchToProps,一个是要绑定的组件本身。

    Store

    Store 就是把 Reducer 和 action 联系到一起的对象。Store 有以下职责:

    1. 维持应用的 state–类似数据库,存储应用的所有state。

    2. 提供 getState() 方法。获取 所有的当前state;

    3. 提供 dispatch(action) 方法更新 state,相当于存入数据库,存入action来改变state。

    4. 通过 subscribe(listener) 注册监听器。

    Store本质上是一个对象,它以树的形式保存了整个应用的State。并提供了一些方法。例如getState( ) 和 dispatch( )。

    Redux应用只有惟一一个Store。

    Store通过createStore方法来创建,根据整个应用的根Reducer的初始State。

    代码如下:

    import { createStore, applyMiddleware } from 'redux';
    import thunk from 'redux-thunk';//异步
    import reducers from './reducers';
    const Store = applyMiddleware(thunk)(createStore)(reducers);
    export default Store;

    Reducers

    Action只是描述了有事情发生了这一事实,并没有指明应用如何更新state。这是reducer要做的事情。

    Reducer的本质是一个函数,并且是一个纯函数。没有任何副作用。简单来讲Reducer只负责做一件事,就是根据接收到的action和state来修改Store中的state:

    (state, action) => newState

    一般实现的时候,通过switch(action.type) 来判断不同的Action,default为旧state。同时可以定义初始状态。

    代码:

    import { combineReducers } from 'redux';
    const newState = (state = {}, action = {}) => {
     switch (action.type) {
      case ActionTypes.CSTATE:
       return { ...state, ...action.state };
      case '_DPDATACHANGE_':
       return {...state, ...action.dpState};
      default:
       return state;
     }
    };
    //Reducer 合并
    export default combineReducers({
     newState,
    });

    注意:返回的是新state,如果需要保留部分旧state值,使用…state(ES7的对象展开语法,对对象会浅拷贝对应属性,这里等价于Object.assign({}, state, newState)),而如果合并state的话只会合并一层,对复杂state需要手动合并。

    Action

    Action是一个普通JS对象,至少包括一个type属性代表事件,其他属性可以用来传递数据。实践上对一个流程定义一个函数,流程可以包括网络请求,最后返回Action,这个函数叫Action Creator。

    代码:Store可以dispatch这个Action,action的type表示标识符,state是它携带的数据。

    export const newState = state => {
     Store.dispatch({
      type: ActionTypes.CSTATE,
      state,
     });
    };

    持久化

    当触发action时根据其reducer key恢复数据,然后只需要在应用启动时分发action,这也很容易抽象成可配置的拓展服务,实际上三方库redux-persist已经为我们做好了这一切。

    在Action中可以代码如下:

    export const getStorage = async (key) => {
     const d = await AsyncStorage.getItem(key);
     return JSON.parse(d);
    };
    export const setStorage = (key, value) => {
     AsyncStorage.setItem(key, JSON.stringify(value));
    };

    connect

    通过- 提供 getState() 方法。获取 所有的当前state

    通过connect,绑定需要的state以及Action Creator到你的组件的props上,这样组件就可以通过props来调用Action Creator,或者根据不同props来render()不同的组件。

    代码:

    mapStateToProps({ newState }) {
          const value = newState[name];//name: newState.name
          return {
           name,
          };
         },

    上面是我整理给大家的,希望今后会对大家有帮助。

    相关文章:

    在Angular中如何实现隐藏显示

    在Angular中如何实现敏感文字提示

    在Angular中如何实现orderBy排序与模糊查询

    在javascript中如何获取键盘的keyCode

    vue vuex vue-rouert 权限路由(详细教程)

    以上就是在ReactNative中如何使用Redux架构的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:在javascript中如何实现显式转换与隐式转换 下一篇:在Angular中使用MathJax碰到哪些问题?
    PHP编程就业班

    相关文章推荐

    • 你能搞懂JS的this指向问题吗?看看这篇文章• 浅析react18中的新概念Transition• javascript跨域的原因是什么• 什么是事件循环?详解Node.js中的事件循环• 一起来分析JavaScript五大事件

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网