美文网首页
React Native中Redux的使用

React Native中Redux的使用

作者: 董董董董董董董董董大笨蛋 | 来源:发表于2017-05-26 19:26 被阅读0次
    React Native中Redux的使用
    模拟登陆功能
    • 结构目录
    Paste_Image.png

    -Login.js

    'use strict';
    import * as types from '../constants/ActionTypes';
    
    // 模拟服务器返回的用户信息
    let user = {
      'name': 'admin',
      'age': '24'
    }
    
    export function doLogin()
    {
      return dispatch => {
        dispatch(isLogining());
        // 模拟用户登录
        let result = fetch('https://github.com/')
            .then((res)=>{
              dispatch(loginSuccess(true, user));
            }).catch((e)=>{
              dispatch(loginSuccess(false, null));
            });
      }
    }
    
    function isLogining()
    {
      return {
        type: types.LOGIN_IN_DOING
      }
    }
    
    function loginSuccess(isSuccess, user)
    {
      return{
        type: types.LOGIN_IN_DONE,
        isSuccess: isSuccess,
        user: user
      }
    }
    
    
    • ActionTypes.js
    export const LOGIN_IN_INIT = 'LOGIN_IN_INIT'; // 初始状态
    export const LOGIN_IN_DOING = 'LOGIN_IN_DOING'; // 正在登录
    export const LOGIN_IN_DONE = 'LOGIN_IN_DONE'; // 登录完成
    
    
    • App.js
    /* @flow */
    
    import React, { Component } from 'react';
    import {
      View,
      Text,
      Navigator
    } from 'react-native';
    
    import LoginPage from '../pages/LoginPage'
    
    export default class App extends Component {
      render() {
        return (
            <Navigator
                style={{flex: 1}}
                initialRoute= {{id: 'LoginPage', component: LoginPage}}
                configureScene= {this.configureScene}
                renderScene= {this.renderScene}
            />
        );
      }
      configureScene(route, routeStack) {
        if (route.sceneConfig) { // 有设置场景
            return route.sceneConfig;
        }
        return Navigator.SceneConfigs.PushFromRight; // 默认,右侧弹出
      }
      renderScene(route, navigator) {
        return <route.component {...route.passProps} navigator= {navigator}/>;
      }
    }
    
    
    • LoginPage.js
    /* @flow */
    
    import React, { Component } from 'react';
    import {
      View,
      Text,
      StyleSheet,
      TouchableOpacity,
    } from 'react-native';
    
    import {connect} from 'react-redux';
    import {doLogin} from '../actions/Login'
    
    import MainPage from '../pages/MainPage'
    
    class LoginPage extends Component {
    
      shouldComponentUpdate(nextProps, nextState)
      {
        // 登录完成,且成功登录
        if (nextProps.status === 'done' && nextProps.isSuccess) {
          this.props.navigator.replace({
            id: 'MainPage',
            component: MainPage,
            passProps: {
               user: nextProps.user
            },
          });
          return false;
        }
        return true;
      }
    
      render() {
        let tips;
        if (this.props.status === 'init')
        {
          tips = '请点击登录';
        }
        else if (this.props.status === 'doing')
        {
          tips = '正在登录...';
        }
        else if (this.props.status === 'done' && !this.props.isSuccess)
        {
          tips = '登录失败, 请重新登录';
        }
        return (
          <View style={{flex: 1, alignItems: 'center', justifyContent: 'center', flexDirection: 'column'}}>
            <Text>{tips}</Text>
            <TouchableOpacity style={{backgroundColor: '#FF0000'}} onPress={this.handleLogin.bind(this)}>
              <View style={{flexDirection: 'row', alignItems: 'center', justifyContent: 'center', width: 100, height: 50}}>
                <Text style={{color: '#FFFFFF', fontSize: 20}}>登录</Text>
              </View>
            </TouchableOpacity>
          </View>
        );
      }
    
      handleLogin()
      {
        this.props.dispatch(doLogin());
      }
    }
    
    function select(store)
    {
      return {
        status: store.loginIn.status,
        isSuccess: store.loginIn.isSuccess,
        user: store.loginIn.user
      }
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
      },
    });
    
    export default connect(select)(LoginPage);
    
    
    • MainPage.js
    /* @flow */
    
    import React, { Component } from 'react';
    import {
      View,
      Text,
      StyleSheet,
    } from 'react-native';
    
    export default class MainPage extends Component {
      render() {
        return (
          <View style={{flex: 1, alignItems: 'center', justifyContent: 'center', flexDirection: 'column'}}>
            <Text>{'姓名:' + this.props.user.name + '\n年龄:' + this.props.user.age}</Text>
          </View>
        );
      }
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
      },
    });
    
    
    • Index.js
    'use strict';
    
    import {combineReducers} from 'redux';
    import loginIn from './Login';
    
    const rootReducer = combineReducers({
      loginIn: loginIn
    });
    
    export default rootReducer;
    
    
    • Login.js
    'use strict';
    
    import * as types from '../constants/ActionTypes';
    
    const initialState = {
      status: 'init',
      isSuccess: false,
      user: null,
    }
    
    export default function loginIn(state = initialState, action) {
      switch (action.type) {
        case types.LOGIN_IN_INIT: // 初始状态
          return Object.assign({}, state, {
            status: 'init',
            isSuccess: false,
            user: null
          });
        case types.LOGIN_IN_DOING: // 正在登录
          return Object.assign({}, state, {
            status: 'doing',
            isSuccess: false,
            user: null
          });
        case types.LOGIN_IN_DONE: // 登录完成
          return Object.assign({}, state, {
            status: 'done',
            isSuccess: action.isSuccess,
            user: action.user
          })
        default:
          return state;
      }
    }
    
    
    • ConfigureStore.js
    'use strict';
    
    import {createStore, applyMiddleware} from 'redux';
    import thunkMiddleware from 'redux-thunk';
    import rootReducer from '../reducers/Index';
    
    const createStoreWithMiddleware = applyMiddleware(thunkMiddleware)(createStore);
    
    export default function configureStore(initialState) {
      const store = createStoreWithMiddleware(rootReducer, initialState);
    
      return store;
    }
    
    
    • Root.js
    /* @flow */
    
    import React, { Component } from 'react';
    import {Provider} from 'react-redux';
    import configureStore from './store/ConfigureStore';
    
    import App from './containers/App';
    
    const store = configureStore();
    
    export default class Root extends Component {
      render() {
        return (
          <Provider store={store}>
            <App />
          </Provider>
        );
      }
    }
    
    

    相关文章

      网友评论

          本文标题:React Native中Redux的使用

          本文链接:https://www.haomeiwen.com/subject/bvixfxtx.html