ReactNative中使用Redux架构总结
本文介绍了reactnative中使用redux架构总结,分享给大家。具体如下:
使用redux也有一段时间了。总结一下。
为什么要使用redux?
背景:
- rn的state(可变,子组件不可见)和props(不可变,子组件可见)的设计,在面对大型项目时候,容易因为不经意修改state造成状态混乱,组件渲染错误
- rn使用了virtual dom,不需要target绑定->action修改ui属性,只要当状态变化,render新状态下的组件,数据单向传递,而mvc的设计模式存在双向数据流。
- rn不易进行测试,redux提供了非常方便的mock测试方式。
redux开发
开发环境
- 安装redux: ‘npm install –save redux'
- 安装react native和redux绑定库:npm install –save react-redux
- 安装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 有以下职责:
- 维持应用的 state–类似数据库,存储应用的所有state。
- 提供 getstate() 方法。获取 所有的当前state;
- 提供 dispatch(action) 方法更新 state,相当于存入数据库,存入action来改变state。
- 通过 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, }; },
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: JS中offset和匀速动画详解