如何在Redux中重新启动initialState值

时间:2018-05-28 14:49:28

标签: redux react-redux react-native-android

大家好,我在本机应用程序中使用redux。好吧,我在导航器的InitialState中保存了一个不良信息,所以当我尝试在android模拟器中重新加载应用程序时,我收到此错误

  

不变的Vilation:没有为关键用户定义路由。必须是以下之一:'主要','欢迎'

enter image description here

错误发生的原因在于此方法

的动作/ user.js的

export function loginWithFacebook(facebookAccessToken) {
return (dispatch) => {
return fetch(`${HOST}/api/v1/facebook`, {
  method: 'POST',
  body: JSON.stringify({
    facebook_access_token: facebookAccessToken,
  }),
  headers: { "content-type": "application/json" },
})
.then(response => response.json())
.then(json => {
  console.log(json);

  if (json.access_token) {
    dispatch(setAccessToken(json.access_token));
    dispatch(setProfile(normalizeProfile(json.email, json.fullname, json.image)));
    dispatch(resetRoute({ routeName: 'Welcome' }));
  } else {
    alert(json.error);
  }
})
.catch(e => alert(e)); }; }

此行发生错误

  

dispatch(resetRoute({routeName:' Welcome'}));

我写了#34; Home"相反"欢迎"

  

并将值Home添加到我的initialState导航而不是欢迎值

的动作/ nav.js

export function resetRoute(route) {
return (dispatch, getState) => {
const nav = getState().nav;
dispatch(NavigationActions.reset({
  index: 0,
  key: null,
  actions: [
    NavigationActions.navigate(route)
  ]
})); }; }

减速

index.js

export default combineReducers({
nav,
user });

nav.js

const initialState =        AppNavigator.router.getStateForAction(NavigationActions.reset({
index: 0,
actions: [
  NavigationActions.navigate({
    routeName: 'Main',
  }),
], }));

export default function(state = initialState, action) {
  //state = undefined;
  const nextState = AppNavigator.router.getStateForAction(action,    state);
  return nextState || state;
};
  

上面的方法抛出异常,因为它调用AppNavigator.router.getStateForAction(action,state);它得到了#34; Home"相反"欢迎"所以基本上我需要重新启动initialState到开头

如何手动设置所有initialState reducer?记得我在Android模拟器中看不到屏幕所以我无法使用按钮或类似的东西触发操作。

我发现这篇文章:How to reset the state of a Redux store?但在我的情况下,我无法看到触发Logout操作的屏幕。

  

我认为解决方案是设置null或清空我的reducers的initialState值可以从头开始。但是我怎么能这样做呢?

1 个答案:

答案 0 :(得分:0)

所以你的主要问题是你要重置商店的状态,但你甚至无法访问第一个屏幕,所以你不能在屏幕上发送动作来重置它,我是对的吗?

您可以执行的操作以及您链接的其他stackoverflow答案:How to reset the state of a Redux store?,您可以在呈现屏幕之前重置状态。

如果你在那里提到你的减速器,你可以在呈现屏幕之前发送动作。例如,在您的应用程序的索引中。例如,您可能希望在索引文件中执行此操作。

您可以通过不使用react-redux但使用dispatch方法将操作直接分发到商店来实现此目的。

在您实际呈现任何屏幕之前,索引文件中的store.dispatch(<Reseting action goes here>)之类的内容。

希望它有所帮助!如果您发现任何问题或者问题不够清楚,请告诉我。干杯!