ReactNative中使用Redux架构总结


Posted in Javascript onDecember 15, 2017

本文介绍了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,
      };
     },

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery乱码与contentType属性设置问题解决方案
Jan 07 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
Jan 23 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
Sep 05 Javascript
浅谈类似于(function(){}).call()的js语句
Mar 30 Javascript
javascript格式化json显示实例分析
Apr 21 Javascript
在HTML中插入JavaScript代码的示例
Jun 03 Javascript
Vue.js 2.0中select级联下拉框实例
Mar 06 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
Jul 30 Javascript
基于Angularjs-router动态改变Title值的问题
Aug 30 Javascript
小程序云开发如何实现图片上传及发表文字
May 17 Javascript
jquery实现异步文件上传ajaxfileupload.js
Oct 23 jQuery
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
Oct 27 Javascript
Angular中使用MathJax遇到的一些问题
Dec 15 #Javascript
vue实现验证码输入框组件
Dec 14 #Javascript
基于滚动条位置判断的简单实例
Dec 14 #Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
Dec 14 #Javascript
ES6/JavaScript使用技巧分享
Dec 14 #Javascript
Django与Vue语法的冲突问题完美解决方法
Dec 14 #Javascript
浅析JS抽象工厂模式
Dec 14 #Javascript
You might like
PHP函数实现分页含文本分页和数字分页
2014/10/23 PHP
PHP中Session可能会引起并发问题
2015/06/26 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
Javascript的一种模块模式
2008/03/22 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
js实现表格字段排序
2014/02/19 Javascript
javascript运动详解
2015/07/06 Javascript
jquery判断当前浏览器的实现代码
2015/11/07 Javascript
jQuery同步提交示例代码
2015/12/12 Javascript
JavaScript基础知识及常用方法总结
2016/01/10 Javascript
javascript的正则匹配方法学习
2016/02/24 Javascript
需要牢记的JavaScript基础知识
2016/09/25 Javascript
angular.js+node.js实现下载图片处理详解
2017/03/31 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
ndm:NPM的桌面GUI应用程序
2018/10/15 Javascript
JS如何实现封装列表右滑动删除收藏按钮
2020/07/23 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
Python爬取三国演义的实现方法
2016/09/12 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
python实现门限回归方式
2020/02/29 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
2020/06/02 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
奥地利汽车配件店:Pkwteile.at
2017/03/10 全球购物
APM Monaco中国官网:来自摩纳哥珠宝品牌
2017/12/27 全球购物
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
倡议书的格式写法
2015/04/28 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
忠诚教育学习心得体会
2016/01/23 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书