在react-native中使用redux框架

前端之家收集整理的这篇文章主要介绍了在react-native中使用redux框架前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在react-native开发中关于数据的流向,state的管理及路由解决等问题会随着项目的复杂让人越来越头疼,也让人力不从心。于是React的开发者推出了Flux架构及官方实现,力图解决这些问题。Flux框架其核心思想就是单项数据流,Flux的整个流程为:Action -> Dispatcher -> Store -> View.

当然Flux框架只是一种单向数据流的思想,业界有很多基于Flux的框架,当下最流行的当属Redux。

Redux的三大定律:1.单一数据源。2.state是只读的,改变state的唯一方法就是触发action,action其实就是一个普通的javascript对象。3.使用纯函数执行修改,这里所说的纯函数就是Redux中reducer。

Redux的组成:

1.action

首先要知道action就是一个信息载体,也是一个javascript对象,对象中至少要包括一个动作行为的唯一标示,比如增删改查操作。

比如:

userAction.js

  1. import * as constant from '../constants/CommonConstants';
  2.  
  3. export function updateData(user){
  4. return {
  5. type: constant.UPDATE_DATA,user: user
  6. };
  7. }
  8.  
  9. export function requestData(){
  10. return dispatch => {
  11. let url = 'https://my.oschina.net/gef';
  12. fetch(url)
  13. .then((response) =>{
  14. console.log("response:" + response);
  15. return response.text();
  16. })
  17. .then((responseText) => {
  18. console.log("responseText:" + responseText);
  19. if (responseText) {
  20. let user = {
  21. 'name' : "葛夫锋",'age' : 18,'job' :'developer'
  22. };
  23. dispatch(updateData(user));
  24. }
  25. })
  26. .catch((error) => {
  27. console.log("error:" + error);
  28. });
  29. };
  30.  
  31. }

我定义了两个action,第一个是更新数据的action,第二个是请求数据的action,第二个action所return的其实是一个函数,其参数为dispatch,然后进行了网络请求,请求成功之后执行了第一个action。

2.reducer

action定义了要执行的操作,但是没有规定action执行之后state如何变化,那么reducer的任务就是定义整个程序的state如何响应。

其实reducer就是一个纯函数,例如:

UserReducer.js

  1. import * as constant from '../constants/CommonConstants'
  2.  
  3. const initState = {
  4. flag:1,//1请求中 2请求成功
  5. user: null
  6. }
  7.  
  8. export default function addUser(state = initState,action){
  9. switch(action.type){
  10. case constant.LOAD_USER:
  11. return Object.assign({},state,{flag : 1});
  12. case constant.UPDATE_DATA:
  13. return Object.assign({},{flag : 2,user : action.user});
  14. default:
  15. return state;
  16. }
  17.  
  18. }

baseReducers.js

  1. import {combineReducers} from 'redux';
  2. import UserReducer from './UserReducer';
  3.  
  4. const rootReducer = combineReducers({
  5. UserReducer
  6. });
  7. export default rootReducer;
3.store
store是action和reducer的粘合剂,它可以完成以下任务:
  1. 保存整个程序的state@H_502_48@
  2. 通过getState()方法访问state的值@H_502_48@
  3. 通过dispatch()方法执行一个action@H_502_48@
  4. 通过subscribe(listener)注册回调,监听state的变化@H_502_48@

例如:

index.ios.js

  1. /**
  2. * Sample React Native App
  3. * https://github.com/facebook/react-native
  4. * @flow
  5. */
  6.  
  7. import {
  8. AppRegistry,} from 'react-native';
  9. import React from 'react';
  10.  
  11. import {applyMiddleware,createStore} from 'redux';
  12. import thunk from 'redux-thunk';
  13. import {Provider} from 'react-redux';
  14.  
  15. import Root from './app/root';
  16. import rootReducers from './app/reducers/baseReducers';
  17.  
  18.  
  19. var store = createStore(rootReducers,applyMiddleware(thunk));
  20.  
  21. function App(props){
  22. return (
  23. <Provider store = {store}>
  24. <Root {...this.props}/>
  25. </Provider>
  26. );
  27. };
  28.  
  29. AppRegistry.registerComponent('ReduxDemo',() => App);

root.js

  1. import React from 'react';
  2. import {View,StyleSheet,Text} from 'react-native';
  3. import {connect} from 'react-redux';
  4. import {requestData,updateData2} from './actions/userAction';
  5.  
  6. class Root extends React.Component{
  7. render(){
  8. let {flag,user} = this.props;
  9. //flag
  10. let content = null;
  11. if(flag == 1){
  12. content = (<Text>加载中</Text>);
  13. }else{
  14. content = (<Text>加载成功</Text>);
  15. }
  16. //user
  17. let userView = null;
  18. if (user) {
  19. userView = (<View style = {style.userView}>
  20. <Text>姓名:{user.name}</Text>
  21. <Text>年龄:{user.age}</Text>
  22. <Text>工作:{user.job}</Text>
  23. </View>);
  24. }
  25.  
  26. return (
  27. <View style = {style.container}>
  28. {content}
  29. {userView}
  30. </View>
  31. );
  32. }
  33. componentDidMount(){
  34. let {updateData} = this.props;
  35. updateData();
  36. }
  37. }
  38. const style = StyleSheet.create({
  39. container:{
  40. flex: 1,alignItems: 'center',justifyContent:'center',backgroundColor: '#FF6A6A'
  41. },userView:{
  42. marginTop:10
  43. }
  44. });
  45.  
  46. function mapStateToProps(state){
  47. return {
  48. flag:state.UserReducer.flag,user:state.UserReducer.user
  49. };
  50. }
  51. function mapDispatchToProps(dispatch){
  52. return {
  53. updateData:function(){
  54. dispatch(requestData());
  55. }
  56. };
  57. }
  58. export default connect(mapStateToProps,mapDispatchToProps)(Root);

这里用到了react-redux库,用于辅助在React项目中使用Redux,它的API相当简单,包括一个React Component(Provider)和一个高阶方法connect。

这里还用到了一个middleware,叫做redux-thunk。redux-thunk的存在允许 store.dispatch一个函数,也就是action不是一个javascript对象,而可以是一个函数

以上代码例子组合起来就是一个网络异步加载的小例子,其运行效果如下:

完整代码

https://github.com/johngef/Redux-Demo

猜你在找的React相关文章