2017-06-17 15 views
4

私はアンドロイドアプリケーションを開発しています。これにより、画面はユーザがログインしているかどうかに依存します。ログインデータは、AsyncStorage内に保存されます。Native Reduxに反応します - デフォルト状態をasyncstorageから初期化します

アプリケーションが起動するまでには、AsyncStorageからデータを取得してデフォルトの状態にする必要があります。どうすればそれを達成できますか?以下は

は私のReduxの構造

index.android.js

import { 
    AppRegistry, 
} from 'react-native'; 

import Root from './src/scripts/Root.js'; 

AppRegistry.registerComponent('reduxReactNavigation',() => Root); 

Root.js

import React, { Component } from "react"; 
import { Text, AsyncStorage } from "react-native"; 
import { Provider, connect } from "react-redux"; 
import { addNavigationHelpers } from 'react-navigation'; 

import getStore from "./store"; 
import { AppNavigator } from './routers'; 

const navReducer = (state, action) => { 
    const newState = AppNavigator.router.getStateForAction(action, state); 
    return newState || state; 
}; 

const mapStateToProps = (state) => ({ 
    nav: state.nav 
}); 

const user = {}; 

class App extends Component { 
    constructor(){ 
    super(); 
    } 

    render() { 
    return (
     <AppNavigator 
      navigation={addNavigationHelpers({ 
       dispatch: this.props.dispatch, 
       state: this.props.nav 
      })} 
     /> 
    ); 
    } 
} 

const AppWithNavigationState = connect(mapStateToProps)(App); 

const store = getStore(navReducer); 

export default function Root() { 
    return (
     <Provider store={store}> 
      <AppWithNavigationState /> 
     </Provider> 
    ); 
} 

ユーザー減速

import { 
    REGISTER_USER, 
    UPDATE_USER, 
    LOGIN_USER 
} from '../../actions/actionTypes'; 

import { handleActions } from 'redux-actions'; 

**// here is the default state, i would like to get from asyncstorage** 
const defaultState = { 
    isLoggedIn: false, 
    user:{}, 
}; 

export const user = handleActions({ 
    REGISTER_USER: { 
    next(state, action){ 
     return { ...state, user: action.payload, isLoggedIn: true } 
    } 
    }, 
    LOGIN_USER: { 
    next(state, action){ 
     return { ...state, user: action.payload, isLoggedIn: true } 
    } 
    }, 
}, defaultState); 
+0

初期状態をcreateStore関数に与えることができます:http://redux.js.org/docs/api/createStore.html。非同期ストレージからデータを読み取り、それを適切な状態を設定するcreateStore()関数に渡すことができます。 –

+0

@AnkitAggarwal asyncstorageからデータを取得し、createstoreに渡すべき場所の例を教えてください。 asyncstorageが非同期であるため、初期化するための良い方法は何かわかりません –

+1

redux-persis(https://github.com/rt2zz/redux-persist)について読んでこの概念(https:// github.com/rt2zz/redux-persist/blob/master/docs/recipes.md#delay-render-until-rehydration-complete)。 redux-persistをそのまま使用する必要はありませんが、ここから復水のアイデアを使用することができます。遅延レンダリングの2番目のリンクを確認してください。 –

答えて

0

あなたはコンポーネントのライフサイクルを使用することができますですメソッドcomp onentWillMountを使用してAsyncStorageからデータを取得し、データが到着したときに状態を変更できます。

関連する問題