redux实践(一)

上节我们已经完成对redux和navigation的集成了

下面我们来说明一下redux使用步骤

首先我们来看一张图


图片1.png

这里我们了解一下三个概念 store、action、reducer,store存储数据,action,请求状态改变动作,reducer就是改变状态
redux整个流程原理可以这样来描述,用户通过可视化界面View触发一个请求动作,在程序内部触发一个Action,Action完成数据请求和变化工作后,通过reducer来更新state,并写入store中,整个流程操作完毕。

下面我们来完成一个实例,一个简单获取token的过程
1.定义获取token的Action

let KEY = 'USERTOKEN';
export function userToken() {
    return dispatch => {
        return AsyncStorage.getItem(KEY,(Error,result)=>{
                if (result === null){

                    let data = JSON.parse('{"success":true,"token":"e143e928-032c-47ea-a571-f49bcaf83842"}');
                    if (data && data.success){
                        let token = data.token;
                        AsyncStorage.setItem(KEY,token,(error)=>{
                            if (error){
                                console.log('存储失败' + error);
                                // Alert.alert('获取失败,请稍后重试');
                            }else {
                                console.log('存储成功');
                                dispatch(getUserToken(token));
                            }
                        })
                    }

                }else {
                    console.log('获取成功' + result);
                    // TOKEN = '0ddc64eb-48e3-4d4c-a83c-a61caa2450d4';
                    dispatch(getUserToken(result));
                }
            });
        }
};


export function getUserToken(userToken) {
    return {
        type: types.USER_TOKEN_SUCCESS,
        userToken
    }
}

这里非常简单就是判断内存里面有没有存储“userToken”没有就写入 ,然后返回token操作。
有了action,就应该有有保存action返回的结果,接下来我们来定义一个reducer

// Reducer是纯函数,里面不应该有过多的逻辑。
import { combineReducers  } from 'redux';
// 这个是ShiTu页面中用到的Reducer
import ShiTuReducer from './ShiTuReducer';
import StackReducer from './StackReducer';
 
const RootReducer = combineReducers({
    ShiTuReducer,
    StackReducer
});
export default RootReducer;
// ActionTypes里面存放着App中可能发生的情况
import * as types from '../constant/ActionTypes';

// 初始化值
const initialState = {
    imageURL: 'timg',
    userToken: '',
    webViewUrl: '',
    qiNiuData: null,
};

// 导出ShiTuReducer。
export default function ShiTuReducer(state = initialState, action){
    // console.log(action);

    // 通过switch来判断types的值,在action中实现功能
    switch (action.type) {
        // 当type=USER_TOKEN_SUCCESS时,会将action中的值,
        // 赋给userToken,在ShiTu.js中就能拿到userToken的值。
        case types.USER_TOKEN_SUCCESS:
            // console.log(action);
            return Object.assign({}, state, {
                ...state,
                userToken: action.userToken,
            });
        case types.QINIU_UPLOAD_TOKEN:
            // console.log(action);
            return Object.assign({}, state, {
                qiNiuData:action.qiNiuData,
            });
        case types.WEBVIEW_URL:
            return Object.assign({}, state ,{
                ...state,
                webViewUrl:action.webViewUrl,
            });
        case types.BACKIMAGE_URL:
            return Object.assign({}, state ,{
                imageURL:action.imageURL,
            });
        default:
            return state;
    }
}
 
import { MyApp } from '../App';


export default function StackReducer(state , action) {
     let  nextState = MyApp.router.getStateForAction(action, state);
    return nextState || state;
}

以上三段代码解释一下,我们知道Action有好多个,那么触发保存Action结果的reducer也必须有多个,那么这里rootReducer相当于一个合成器一样,把所有reducer合成在一起,而其他reducer就可以各自写入一个独立的文件中,不相互影响
最后一步,在Main2中如何使用呢?

export default connect((state) => {
  const { ShiTuReducer ,StackReducer } = state;
  return {
      ShiTuReducer,
      StackReducer
  };
},{ userToken })(Main2);


class Main2 extends Component {

  constructor(props){
    super(props);
    this.state = {
      userName:'linjian',
      userToken:'',
    }
    this.resetActions = this.resetActions.bind(this);
    this.goBack = this.goBack.bind(this)
  }
  componentDidMount(){
      // 使用userToken方法。
      this.props.userToken();  
  }
  componentWillReceiveProps(nextProps){
    const { userToken} = nextProps.ShiTuReducer;
    this.setState({userToken:userToken});
  }
  resetActions(){
    //这个方法是重置了整个路由栈信息,那我们要在actions中重新定义路由栈,下面的的index参数代表新路由栈默认显示的页面
    const resetAction = NavigationActions.reset({
      index: 1,
      actions: [
        NavigationActions.navigate({ routeName: 'ReactNavigation'}),
        NavigationActions.navigate({ routeName: 'profile'})
      ]
    })
    this.props.navigation.dispatch(resetAction)
  }
  goBack(){
    // debugger;
     let routes = this.props.StackReducer.routes;
     
    routes.forEach(function(item) {
      if(item.routeName === 'Main2'){
        const { goBack } = this.props.navigation;
        goBack(item.key);
      }
    }, this);
     
  }
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          Welcome to Main22222!
        </Text>
        <Text style={styles.instructions}>
          The user toke is  {this.state.userToken}
        </Text>
        <Text style={styles.instructions}>
          Double tap R on your keyboard to reload,{'\n'}
          Shake or press menu button for dev menu
        </Text>
        <Text style={styles.instructions}>
          userName:{this.state.userName}
        </Text>
        <TouchableOpacity onPress={()=>{this.resetActions()}}>
          <Text>跳转到ProfileScreen并替换掉main2</Text>
        </TouchableOpacity>
        <TouchableOpacity onPress={()=>{nav.push("Main3")}}>
          <Text>跳转到main3</Text>
        </TouchableOpacity>
      </View>
    );
  }
}

这样usertoken就能显示了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容