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 读取和设置文档元素的样式属性
Apr 14 Javascript
JQuery Tips(2) 关于$()包装集你不知道的
Dec 14 Javascript
JQuery动态创建DOM、表单元素的实现代码
Aug 09 Javascript
40个新鲜出炉的jQuery 插件和免费教程[上]
Jul 24 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
Sep 06 Javascript
javascript 获取浏览器版本
Jan 21 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
Jan 21 Javascript
微信小程序 Flex布局详解
Oct 09 Javascript
利用express启动一个server服务的方法
Sep 17 Javascript
在小程序开发中使用npm的方法
Oct 17 Javascript
vue.js中ref和$refs的使用及示例讲解
Aug 14 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
Apr 14 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
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
php在linux环境中如何使用redis详解
2020/12/15 PHP
通过Jquery遍历Json的两种数据结构的实现代码
2011/01/19 Javascript
浅谈Javascript面向对象编程
2011/11/15 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
JS实现兼容性较好的随屏滚动效果
2015/11/09 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
form表单序列化详解(推荐)
2017/08/15 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
vue2导航根据路由传值,而改变导航内容的实例
2017/11/10 Javascript
vue 组件中添加样式不生效的解决方法
2018/07/06 Javascript
vue-router传参用法详解
2019/01/19 Javascript
关于vue组件事件属性穿透详解
2019/10/28 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
Vue数组响应式操作及高阶函数使用代码详解
2020/08/01 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
python爬虫使用cookie登录详解
2017/12/27 Python
python将字典内容存入mysql实例代码
2018/01/18 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
Python flask框架实现查询数据库并显示数据
2020/06/04 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
CSS3 border-image详解、应用及jQuery插件
2011/08/29 HTML / CSS
css3学习系列之移动属性详解
2017/07/04 HTML / CSS
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
酒店大堂副理的职责范文
2014/02/13 职场文书
地理科学专业自荐信
2014/09/01 职场文书
大学生党员自我评价
2015/03/04 职场文书
公司内部升职自荐信
2015/03/27 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL
zabbix agent2 监控oracle数据库的方法
2021/05/13 Oracle
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js