ReactNative中使用Redux架构总结
本文介绍了ReactNative中使用Redux架构总结,分享给大家。具体如下:
使用Redux也有一段时间了。总结一下。
为什么要使用Redux?
背景:
- RN的state(可变,子组件不可见)和props(不可变,子组件可见)的设计,在面对大型项目时候,容易因为不经意修改state造成状态混乱,组件渲染错误
- RN使用了VirtualDOM,不需要Target绑定->Action修改UI属性,只要当状态变化,render新状态下的组件,数据单向传递,而MVC的设计模式存在双向数据流。
- RN不易进行测试,Redux提供了非常方便的mock测试方式。
Redux开发
开发环境
- 安装Redux:‘npminstall–saveredux'
- 安装ReactNative和Redux绑定库:npminstall–savereact-redux
- 安装ReduxThunk异步Action中间件:npminstall–saveredux-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'; importthunkfrom'redux-thunk';//异步 importreducersfrom'./reducers'; constStore=applyMiddleware(thunk)(createStore)(reducers); exportdefaultStore;
Reducers
Action只是描述了有事情发生了这一事实,并没有指明应用如何更新state。这是reducer要做的事情。
Reducer的本质是一个函数,并且是一个纯函数。没有任何副作用。简单来讲Reducer只负责做一件事,就是根据接收到的action和state来修改Store中的state:
(state,action)=>newState
一般实现的时候,通过switch(action.type)来判断不同的Action,default为旧state。同时可以定义初始状态。
代码:
import{combineReducers}from'redux'; constnewState=(state={},action={})=>{ switch(action.type){ caseActionTypes.CSTATE: return{...state,...action.state}; case'_DPDATACHANGE_': return{...state,...action.dpState}; default: returnstate; } }; //Reducer合并 exportdefaultcombineReducers({ newState, });
注意:返回的是新state,如果需要保留部分旧state值,使用…state(ES7的对象展开语法,对对象会浅拷贝对应属性,这里等价于Object.assign({},state,newState)),而如果合并state的话只会合并一层,对复杂state需要手动合并。
Action
Action是一个普通JS对象,至少包括一个type属性代表事件,其他属性可以用来传递数据。实践上对一个流程定义一个函数,流程可以包括网络请求,最后返回Action,这个函数叫ActionCreator。
代码:Store可以dispatch这个Action,action的type表示标识符,state是它携带的数据。
exportconstnewState=state=>{ Store.dispatch({ type:ActionTypes.CSTATE, state, }); };
持久化
当触发action时根据其reducerkey恢复数据,然后只需要在应用启动时分发action,这也很容易抽象成可配置的拓展服务,实际上三方库redux-persist已经为我们做好了这一切。
在Action中可以代码如下:
exportconstgetStorage=async(key)=>{ constd=awaitAsyncStorage.getItem(key); returnJSON.parse(d); }; exportconstsetStorage=(key,value)=>{ AsyncStorage.setItem(key,JSON.stringify(value)); };
connect
通过-提供getState()方法。获取所有的当前state
通过connect,绑定需要的state以及ActionCreator到你的组件的props上,这样组件就可以通过props来调用ActionCreator,或者根据不同props来render()不同的组件。
代码:
mapStateToProps({newState}){ constvalue=newState[name];//name:newState.name return{ name, }; },
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。