使用道具从另一个动作分派一个动作(Redux)

时间:2020-06-04 18:04:04

标签: reactjs react-native redux

因此,我执行此login()操作,如果登录成功,则将用户重定向到供稿。我也有这个register()动作,可以创建一个新用户并在之后调用login()动作。

问题是login()register()调用时没有收到道具,所以我不能从那里调用this.navigation.navigate('Feed')

userActions.js

function register(user) {
  return dispatch => {
    dispatch(request(user));
    let { username, password } = user

    userService.register(user)
      .then(
        user => {
          dispatch(success(user));
          dispatch(login(username, password)) //calls login() after the user is created
        },
        error => {
          dispatch(failure(error.toString()));
        }
      );
  };

  function request(user) { return { type: userConstants.REGISTER_REQUEST, user } }
  function success(user) { return { type: userConstants.REGISTER_SUCCESS, user } }
  function failure(error) { return { type: userConstants.REGISTER_FAILURE, error } }
}

function login(username, password) {
  return dispatch => {
    dispatch(request({ username }));

    userService.login(username, password)
      .then(
        user => {
          dispatch(success(user));
          this.navigation.navigate('Feed') //this is throwing "undefined is not an object" when login() is dispatched from register()
        },
        error => {
          dispatch(failure(error.toString()));
        }
      );
  };

  function request(user) { return { type: userConstants.LOGIN_REQUEST, user } }
  function success(user) { return { type: userConstants.LOGIN_SUCCESS, user } }
  function failure(error) { return { type: userConstants.LOGIN_FAILURE, error } }
}

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

我认为您的代码需要修复一些。 在redux动作中处理导航不是一个好的解决方案。为了避免这种情况,建议将Saga与Redux一起使用。

但是,使用此代码,您没有将导航属性传递给动作,因此您需要传递props变量来首先注册动作。 请这样尝试。

function register(user, props) {
...
    dispatch(login(username, password, props))
...

function login(username, password, props) {
    ...
    props.navigation.navigate('Feed')

然后导航将起作用。 希望这可以帮助您了解) 根据我的经验,我建议将Redux和Saga用作堆栈。