【问题标题】:React Redux - undefined is not an object evaluating this.props.navigation.navigateReact Redux - undefined 不是评估 this.props.navigation.navigate 的对象
【发布时间】:2019-07-31 00:34:36
【问题描述】:

我是 Redux 的新手,我不明白以下设置有什么问题。我收到错误:TypeError: TypeError: undefined is not an object (evalating 'this.props.navigation.navigate')

对于操作,我有一个登录功能:

export const loginWithEmail = ({email, password}) => async (dispatch) => {
    dispatch({type: "LOADING"})
    try {
        let user = await auth.signInWithEmailAndPassword(email, password);
        dispatch({type: "LOGIN_SUCCESS", payload: user})
    } catch (error) {
        dispatch({type: "LOGIN_FAILURE"})
    }
}

登录组件:

class Login extends Component {
  componentWillReceiveProps(nextProps) {
    if(!_.isEmpty(nextProps.user)) {
      this.props.navigation.navigate('Home');
    }
  }

  login() {
    const {email, password} = this.props;
    this.props.loginWithEmail({email, password});
  }

  render() {
    return (
      ...
    )
  }
}

const mapStateToProps = state => {
  return {
    email: state.auth.email,
    password: state.auth.password,
    error: state.auth.error,
    user: state.auth.user
  }
}

export default connect(mapStateToProps, {loginWithEmail})(Login);

在我的 App.js 中

const AuthStack = createStackNavigator({
  Login: { screen: Login }
});

const MainStack = createStackNavigator(
  {
    Home: { screen: 'Home' },
    Auth: AuthStack
  },
  {
    initialRouteName: 'Home'
  }
);

const AppContainer = createAppContainer(MainStack);

export default class App extends React.Component {
  constructor(props) {
    super(props);
  }

  render() {
    const store = createStore(reducers, {}, applyMiddleware(ReduxThunk));
    return (
      <Provider store={store}>
        <AppContainer/>
      </Provider>
    );
  }
}

我也尝试在另一个组件中使用登录组件,如下所示:

const store = createStore(reducers, {}, applyMiddleware(ReduxThunk));
return (
...
    <Provider store={store}>
        <Login navigation={this.props.navigation}/>
    </Provider>

我的 react-navigation 版本是 3.2.1

更新:尝试遵循React Native: TypeError: undefined is not an object (evaluating 'this.props.navigation.navigate') 的解决方案,但没有成功

【问题讨论】:

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


【解决方案1】:

这是因为您直接使用登录屏幕组件的其他文件。

<Provider store={store}>
    <Login/>
</Provider>

如果您期望this.props.navigation 有值,则不会。这里的解决方案是删除Provider 的其他用途。

您已经拥有的以下内容足以连接到 Redux。

<Provider store={store}>
    <AppContainer/>
</Provider>

【讨论】:

  • 不确定我是否跟随,如果我需要在另一个文件中使用登录组件怎么办?我应该完全依赖 App.js 吗?
  • 据我所知,您将Login 组件设置为“屏幕”。所以唯一应该使用Login 的地方是在 react-navigation 路由器堆栈中。如果您希望 Login 成为可重用组件,那么您不应该在 react-navigation 堆栈中使用它。相反,您将拥有类似 LoginScreen 的组件,它使用 Login 组件。如果需要,我可以澄清和扩展更多内容。
  • @JacobMarsellos 还注意到在示例中redux.js.org/basics/store 他们只在 index.js 中创建一次存储。您应该只在顶层创建一次商店。所以你只需要在你的 App.js 中创建一次。 Provider 允许所有其他组件通过 connect 函数连接到 store。
  • 我有另一个组件调用登录作为子组件的原因是因为我也有一个注册组件。这个父组件包含登录和注册。根据你上面说的,我应该把这个父组件作为一个屏幕吗?在这种情况下,我真的不能删除对 Provider 的这种使用
  • 如果您的组件位于连接到 redux 的屏幕中,那么您可以将所需的项目传递到组件中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 2016-10-14
相关资源
最近更新 更多