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,
      };
     },

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

(0)

相关推荐

  • React/Redux应用使用Async/Await的方法

    Async/Await是尚未正式公布的ES7标准新特性.简而言之,就是让你以同步方法的思维编写异步代码.对于前端,异步任务代码的编写经历了 callback 到现在流行的 Promise ,最终会进化为 Async/Await .虽然这个特性尚未正式发布,但是利用babel polyfill我们已经可以在应用中使用它了. 现在假设一个简单的React/Redux应用,我将引入 Async/Await 到其代码. Actions 此例子中有一个创建新文章的 Action ,传统方法是利用 Prom

  • react-redux中connect()方法详细解析

    组件 React-Redux将所有组件分为两大类:展示组件(UI组件),容器组件 展示组件有以下几个特征: 只负责 UI 的呈现,不带有任何业务逻辑 没有状态(即不使用this.state这个变量) 所有数据都由参数(this.props)提供 不使用任何 Redux 的 API 容器组件有以下几个特征: 负责管理数据和业务逻辑,不负责 UI 的呈现 带有内部状态 使用 Redux 的 API 总结为一点: 展示组件负责 UI 的呈现,容器组件负责管理数据和逻辑 connect方法解析 下图是c

  • 详解关于react-redux中的connect用法介绍及原理解析

    关于react-redux的一个流程图 流程图 connect用法介绍 connect方法声明: connect([mapStateToProps], [mapDispatchToProps], [mergeProps],[options]) 作用:连接React组件与 Redux store. 参数说明: mapStateToProps(state, ownProps) : stateProps 这个函数允许我们将 store 中的数据作为 props 绑定到组件上. const mapSta

  • 浅谈React和Redux的连接react-redux

    之前一直在探索React相关的东西,手上有个SPA项目,于是准备上Redux试试水.Redux本身和React并没有之间的关联,它是一个通用Javscript App模块,用做App State的管理.要在React的项目中使用Redux,比较好的方式是借助react-redux这个库来做连接,这里的意思是,并不是没有react-redux,这两个库就不弄一起用了,而是说react-redux提供了一些封装,一种更科学的代码组织方式,让我们更舒服地在React的代码中使用Redux. 之前仅通过

  • ReactNative中使用Redux架构总结

    本文介绍了ReactNative中使用Redux架构总结,分享给大家.具体如下: 使用Redux也有一段时间了.总结一下. 为什么要使用Redux? 背景: RN的state(可变,子组件不可见)和props(不可变,子组件可见)的设计,在面对大型项目时候,容易因为不经意修改state造成状态混乱,组件渲染错误 RN使用了Virtual DOM,不需要Target绑定->Action修改UI属性,只要当状态变化,render新状态下的组件,数据单向传递,而MVC的设计模式存在双向数据流. RN不

  • 详解在React-Native中持久化redux数据

    在最近的一个项目中,要求对 redux 数据做持久化处理,经过研究后成功实现,在此记录一下过程 我们可以使用 redux-persist 对数据做持久化处理 安装 npm i --save redux-persist 使用 安装成功后,我们需要对 store 代码进行修改,这是我的 store 生成文件 import {applyMiddleware, createStore, compose} from 'redux'; import {createLogger} from 'redux-lo

  • 详解如何优雅地在React项目中使用Redux

    前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与React没有任何关系,其他UI框架也可以使用Redux react-redux React插件,作用:方便在React项目中使用Redux react-thunk 中间件,作用:支持异步action 目录结构 Tips:与Redux无关的目录已省略 |--src |-- store Redux目录

  • 详解Android中实现Redux方法

    Redux 是一个用于应用程序状态管理的开源JavaScript库,其核心是通过可管理和控制的状态来描述一个系统.这意味着其思想其实是可以应用于任何类型应用的开发的,包括移动应用. Redux 架构基于一个严格的单向数据流,应用中的所有数据都是通过组件在一个方向上流动.Redux 希望确保应用的视图是根据确定的状态来呈现的.意思就是,在任何时间点,你应用的状态总是确定.有效的,并且可以转换到另一个可预测和有效的状态.而 UI 将根据所处的状态来进行呈现. 关于 Redux 在网上已经有很多相关的

  • react-native中AsyncStorage实例详解

    react-native中AsyncStorage实例详解 AsyncStorage是一个简单的,具有异步特性的储存API,它的储存方式为键值对的方式,且对整个App而言,是全局的. AsyncStorage提供了较全的方法供我们使用,每个方法都有一个回调函数,而回调函数的第一个参数都是错误对象error,所有的方法执行之后都会返回一个Promise对象. 方法: static getItem(key: string, callback?: ?(error: ?Error, result: ?s

  • React-Native中一些常用组件的用法详解(二)

    前言 本文为大家介绍一下React-Native中一些深入些的组件,由于对ES6的语法并没有完全掌握,这里暂时用ES5和ES6混用的语法. ScrollView组件 能够调用移动平台的ScrollView(滚动视图)的组件,同时还集成了触摸锁定的"响应者"系统. 注意一定要给scrollview一个高度,或者是他父级的高度. 常用方法 onScrollBeginDrag:开始拖拽的时候; onScrollEndDrag:结束拖拽的时候; onMomentumScrollBegin:开始

  • React-Native中一些常用组件的用法详解(一)

    前言 本文为大家介绍一下React-Native中一些常用的组件,由于对ES6的语法并没有完全掌握,这里暂时用ES5和ES6混用的语法. View组件 View是一个支持Flexbox布局.样式.一些触摸处理.和一些无障碍功能的容器,并且它可以放到其它的视图里,也可以有任意多个任意类型的子视图. View的设计初衷是和StyleSheet搭配使用,这样可以使代码更清晰并且获得更高的性能.尽管内联样式也同样可以使用. View的常用样式设置 flex布局样式 backgroundColor:背景颜

  • 优雅的在React项目中使用Redux的方法

    或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与React没有任何关系,其他UI框架也可以使用Redux react-redux React插件,作用:方便在React项目中使用Redux react-thunk 中间件,作用:支持异步action |--src |-- store Redux目录 |-- actions.js |-- index.js |-- reducers.js |-

  • WPF框架Prism中使用MVVM架构

    常见的MVVM框架 众所周知, 如果你了解WPF当中的ICommand, INotifyPropertyChanged的作用, 就会发现众多框架都是基于这些进行扩展, 实现其通知.绑定.命令等功能. 对于不同的MVVM框架而言, 大体使用上会在声明方式上的差异, 以及特定功能上的差别. 下面列举了常用的3个MVVM框架,他们的一些差异.如下所示: 功能↓ / →框架名 Prism Mvvmlight Micorosoft.Toolkit.Mvvm 通知 BindableBase ViewMode

  • React 中使用 Redux 的 4 种写法小结

    目录 不使用 Redux 的写法 最底层的写法 React-Redux React-Redux 配合 connect 高阶组件 React-Rudex 配合 React Hooks Redux Toolkit 总结 Redux 是一种状态容器 JS 库,提供可预测的状态管理,经常和 React 配合来管理应用的全局状态,进行响应式组件更新. Redux 一般来说并不是必须的,只有在项目比较复杂的时候,比如多个分散在不同地方的组件使用同一个状态.对于这种情况,如果通过 props 层层传递,代码会

随机推荐