使用Redux

时间:2018-03-13 17:03:05

标签: react-native react-redux react-navigation

使用React-Navigtion和Redux返回(重置)初始状态的正确方法是什么。

这是我的初始状态:

const firstAction = AppNavigator.router.getActionForPathAndParams('HomeDrawer');
const tempNavState = AppNavigator.router.getStateForAction(firstAction);
const secondAction = AppNavigator.router.getActionForPathAndParams('Login');
const INITIAL_STATE = AppNavigator.router.getStateForAction( secondAction, tempNavState );

这是我的减速机:

export default (state = INITIAL_STATE, action) => {
  let nextState;
  switch (action.type) {
    case 'LOGIN':
      nextState = AppNavigator.router.getStateForAction(NavigationActions.back()), state);
      break;
    case 'LOGOUT_TEMP':
      nextState = AppNavigator.router.getStateForAction(NavigationActions.navigate({ routeName: 'Login' }), state);
      break;
    case 'LOGOUT_START':
      // Don't know exactly what to do here
      nextState = { ...INITIAL_STATE };
      break;
    default:
      nextState = AppNavigator.router.getStateForAction(action, state);
    break;
  }
  return nextState || { ...state };
};

我不确定这是否有效。我不明白React-Navigation如何在幕后处理这个问题。它是否会听取这种类型的状态更改并正确导航,还是需要始终通过getStateForAction(NavigationActions.something(...),state)运行操作?

nextState = { ...INITIAL_STATE };

我之前没有使用Redux时已经这样做了:

const resetLogin = NavigationActions.reset({
  index: 1,
  actions: [
      NavigationActions.navigate({ routeName: "HomeDrawer" }),
      NavigationActions.navigate({ routeName: "Login" })
    ]
});

我是否按上述方法执行以下操作?

nextState = AppNavigator.router.getStateForAction(resetLogin, state);

如何将React-Navigation重置为Redux初始状态,我可以使用上面的const INITIAL_STATE以某种方式执行此操作吗?

谢谢,

沃伦贝尔

1 个答案:

答案 0 :(得分:2)

哇,没有答案。为了记录我最终使用:

const resetLogin = NavigationActions.reset({
  index: 1,
  actions: [
    NavigationActions.navigate({ routeName: "HomeDrawer" }),
    NavigationActions.navigate({ routeName: "Login" })
  ]
});

然后在我的reducer中执行此操作:

nextState = AppNavigator.router.getStateForAction(resetLogin, state)

我还发现使用:

AppNavigator.router.getActionForPathAndParams('ScreenName');
如果'ScreenName'是DrawerNavigator中的屏幕,

不会得到正确的redux动作。使用以下内容可以获得正确的redux操作:

NavigationActions.navigate({ routeName: 'ScreenName' })

希望这有助于其他人。

谢谢,

沃伦贝尔