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 相关文章推荐
用Javascript获取页面元素的具体位置
Dec 09 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
Dec 24 Javascript
js+html5实现可在手机上玩的拼图游戏
Jul 17 Javascript
js验证框架实现代码分享
May 18 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
Jan 21 Javascript
详解JSONObject和JSONArray区别及基本用法
Oct 25 Javascript
VSCode中如何利用d.ts文件进行js智能提示
Apr 13 Javascript
r.js来合并压缩css文件的示例
Apr 26 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
Sep 12 Javascript
Vue组件之高德地图地址选择功能的实例代码
Jun 21 Javascript
OpenLayers3实现鼠标移动显示坐标
Sep 25 Javascript
VUE项目实现主题切换的多种方法
Nov 26 Vue.js
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
ini_set的用法介绍
2014/01/07 PHP
Windows中使用计划任务自动执行PHP程序实例
2014/05/09 PHP
PHP+javascript制作带提示的验证码源码分享
2014/05/28 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
2014/11/20 PHP
完美解决thinkphp验证码出错无法显示的方法
2014/12/09 PHP
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
关于Function中的bind()示例详解
2016/12/02 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
使用Vuex实现一个笔记应用的方法
2018/03/13 Javascript
create-react-app构建项目慢的解决方法
2018/03/14 Javascript
原生js实现的移动端可拖动进度条插件功能详解
2019/08/15 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
go语言计算两个时间的时间差方法
2015/03/13 Python
使用Protocol Buffers的C语言拓展提速Python程序的示例
2015/04/16 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
理发店策划方案
2014/06/05 职场文书
学习计划书怎么写
2014/09/15 职场文书
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
独生子女证明范本
2015/06/19 职场文书
获奖感言范文
2015/07/31 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
基于Python实现将列表数据生成折线图
2022/03/23 Python
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技