それは減速にナビゲーション状態を保存する必要はありません。あなたがそれを必要としない場合は、単に減速機とナビゲーションの状態でアプリの状態を保つだけです。次に、Reduxを次のように統合することができます。
// App.js
import React from 'react';
import { Provider } from 'react-redux'
import RootNavigator from './src/navigation/RootNavigation';
import configureStore from './src/stores/configureStore';
const store = configureStore();
export default class App extends React.Component {
render() {
return (
<Provider store={store}>
<RootNavigator />
</Provider>
);
}
}
実際、Redux内でナビゲーション状態を統合するのはそれほど複雑ではありません。これを行うと、画面間をナビゲートするときにナビゲーション状態が自動的に更新されます。それは複雑なアプリでとても役立ちます。ですから、React NavigationとReduxを一緒に使う方法を説明しようと思います。将来的には役に立つかもしれません。
まず第一に、あなたはあなたのStackNavigator as usualを設定します(使用している場合)
// navigation/RootNavigator.js
const HomeScreen =() => (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Home Screen</Text>
</View>
);
const RootNavigator = StackNavigator({
Home: {
screen: HomeScreen,
},
});
export default RootNavigator;
は、その後、あなたはreducers
フォルダに移動し、navReducer.js
私達はちょうど
RootNavigator.router.getStateForAction
を使用
// reducers/navReducer.js
import RootNavigator from '../navigation/RootNavigation';
const initialState = RootNavigator.router.getStateForAction(RootNavigator.router.getActionForPathAndParams('Home'));
const navReducer = (state = initialState, action) => {
const nextState = RootNavigator.router.getStateForAction(action, state);
// Simply return the original `state` if `nextState` is null or undefined.
return nextState || state;
};
を作成ナビゲーション状態を取得し、新しい減速機の初期状態として設定します。
そして、他の人と減速機を組み合わせた:
// reducers/index.js
Import navReducer from ‘./navReducer’;
const appReducer = combineReducers({
nav: nav,
...
});
は、今、私たちは私たちのApp.js
を変更する必要があります。今のように見えます:
import React from 'react';
import { Provider, connect } from 'react-redux';
import { addNavigationHelpers } from 'react-navigation';
import RootNavigator from './src/navigation/RootNavigation';
import configureStore from './src/stores/configureStore';
const store = configureStore();
class AppComponent extends React.Component {
render() {
return (
<RootNavigator navigation={addNavigationHelpers({
dispatch: this.props.dispatch,
state: this.props.nav,
})} />
);
}
}
const mapStateToProps = (state) => ({
nav: state.navReducer
});
const AppContainer = connect(mapStateToProps)(AppComponent);
export default() => {
return (
<Provider store={store}>
<AppContainer />
</Provider>
)
}
だから、あなただけのルートコンポーネント、addNavigationHelpers
と各コンポーネントをラップする必要はありません。画面間を移動するときにアクションを送信/管理する必要はありません。自動的に更新されます。
まだ私の頭を包んで感動させようとすると、私が見逃したいくつかの重要な点は、navHelpersを取得する必要があり、「connect()」でラップする必要があり、州はその小道具に渡された。私はトップレベルのナビゲータだけがそれを必要としていると思った。 2番目の点は、サンプル反応ナビゲーションのreduxプロジェクトをgithubでチェックしましたが、それらのレデューサーには多くのロジックがありました。私は自分でアクションによってnavデータを減らさなければならないと思っていましたが、単純ですがrouter.getStateForAction()まだチェックして、今寝て! – Seregwethrin
各コンポーネントを 'addNavigationHelpers'でラップする必要はありません。ルートコンポーネントだけです。画面間を移動するときにアクションを送信/管理する必要はありません。自動的に更新されます。そして私が言ったように、減速機にナビゲーション状態を保存する必要はありません。あなたのアプリがシンプルで、余分なロジックが必要ない場合は、私の最初の例を使用してください。 – artiek
各コンポーネントではなく、各ナビゲータ...ルートナビゲータの各ナビゲータはaddNavigationHelpersでラッパーしてはいけませんか? – Seregwethrin