Reactjs 在React中成功调用操作后,如何从组件重定向?

Reactjs 在React中成功调用操作后,如何从组件重定向?,reactjs,Reactjs,我在redux中的操作中调用了一个API export const registerUser = registeredUserData => async dispatch => { let messages; try { const response = await axios.post('/users/register', registeredUserData); messages = response.data } catch (error) {

我在redux中的操作中调用了一个API

export const registerUser = registeredUserData => async dispatch => {
  let messages;
  try {
    const response = await axios.post('/users/register', registeredUserData);
    messages = response.data
  } catch (error) {
    if (error.response) {
      messages = error.response.data
    }
  }

  dispatch({
    type: REGISTER_USER,
    messages,
  });
};
此操作在窗体被sumbit时调用

const onRegisterUser = (e) => {
    e.preventDefault();
    registerUser(registeredUserData);
  };
当,如果呼叫成功,我想重定向到另一个页面。 我面临的问题是,在这种情况下,我不知道如何实现
history.push()

如果我把它放在组件的方法中,就在registerUser(registeredUserData)之后然后无论调用的响应如何,它都会立即被调用。我不确定从行动本身转向是否是个好主意


非常感谢您的帮助。

您就快到了。在组件中,将
this.props.history
作为参数传递给redux操作。然后,在调度操作之后,您可以重定向到其他页面

p.S:从行动本身重定向不是一个坏主意。

组件内部:

const onRegisterUser = (e) => {
    e.preventDefault();
    registerUser(registeredUserData, this.props.history);
  };
export const registerUser = (registeredUserData, history) => async dispatch => {
  let messages;
  try {
    const response = await axios.post('/users/register', registeredUserData);
    messages = response.data
  } catch (error) {
    if (error.response) {
      messages = error.response.data
    }
  }

  dispatch({
    type: REGISTER_USER,
    messages,
  });

    history.push('/redirect-route);
};
在你的行动中:

const onRegisterUser = (e) => {
    e.preventDefault();
    registerUser(registeredUserData, this.props.history);
  };
export const registerUser = (registeredUserData, history) => async dispatch => {
  let messages;
  try {
    const response = await axios.post('/users/register', registeredUserData);
    messages = response.data
  } catch (error) {
    if (error.response) {
      messages = error.response.data
    }
  }

  dispatch({
    type: REGISTER_USER,
    messages,
  });

    history.push('/redirect-route);
};

你就快到了。在组件中,将
this.props.history
作为参数传递给redux操作。然后,在调度操作之后,您可以重定向到其他页面

p.S:从行动本身重定向不是一个坏主意。

组件内部:

const onRegisterUser = (e) => {
    e.preventDefault();
    registerUser(registeredUserData, this.props.history);
  };
export const registerUser = (registeredUserData, history) => async dispatch => {
  let messages;
  try {
    const response = await axios.post('/users/register', registeredUserData);
    messages = response.data
  } catch (error) {
    if (error.response) {
      messages = error.response.data
    }
  }

  dispatch({
    type: REGISTER_USER,
    messages,
  });

    history.push('/redirect-route);
};
在你的行动中:

const onRegisterUser = (e) => {
    e.preventDefault();
    registerUser(registeredUserData, this.props.history);
  };
export const registerUser = (registeredUserData, history) => async dispatch => {
  let messages;
  try {
    const response = await axios.post('/users/register', registeredUserData);
    messages = response.data
  } catch (error) {
    if (error.response) {
      messages = error.response.data
    }
  }

  dispatch({
    type: REGISTER_USER,
    messages,
  });

    history.push('/redirect-route);
};

你好,艾伦,

基本上,您可以从
路由器
获得
this.props.history.push,该路由器将其传递给应用程序中的所有
路由
组件

您可以通过该组件的
render
方法中的
console.log(“\uuu-props\uuuuuu”,this.props)
来确认这一点

为了实现这一点,我建议将其作为回调发送到您的action
registerUser
,以便执行以下操作:

  • cb
    添加到您的操作中:
  • 对于:
    onRegisterUser

希望它能起作用,如果它不起作用,请描述它的行为。

你好,艾伦,

基本上,您可以从
路由器
获得
this.props.history.push,该路由器将其传递给应用程序中的所有
路由
组件

您可以通过该组件的
render
方法中的
console.log(“\uuu-props\uuuuuu”,this.props)
来确认这一点

为了实现这一点,我建议将其作为回调发送到您的action
registerUser
,以便执行以下操作:

  • cb
    添加到您的操作中:
  • 对于:
    onRegisterUser

希望它能起作用,如果它不起作用,请描述其行为。

在您的示例中,您的操作
registerUser
是一个承诺,因为它是一个
异步
函数。因此,您可以将您的
onRegisterUser
重写为如下所示:

const onRegisterUser = (e) => {
    e.preventDefault();
    registerUser(registeredUserData)
        .then(() => /* success */)
        .catch(error => /* handle my failure */)
};
export const registerUser = registeredUserData => async dispatch => {
  try {
    const response = await axios.post('/users/register', registeredUserData);
    dispatch({
      type: REGISTER_USER_SUCCESS,
      messages: response.data,
    });
  } catch (error) {
    if (error.response) {
      dispatch({
        type: REGISTER_USER_FAILURE,
        messages: error.response.data,
      });
    }
  }
};
<>你可能想考虑创建<代码>成功< /代码>和<代码>失败<代码>网络调用的动作。这允许您根据注册用户api调用潜在地更新redux的状态

您可以将thunk修改为如下所示:

const onRegisterUser = (e) => {
    e.preventDefault();
    registerUser(registeredUserData)
        .then(() => /* success */)
        .catch(error => /* handle my failure */)
};
export const registerUser = registeredUserData => async dispatch => {
  try {
    const response = await axios.post('/users/register', registeredUserData);
    dispatch({
      type: REGISTER_USER_SUCCESS,
      messages: response.data,
    });
  } catch (error) {
    if (error.response) {
      dispatch({
        type: REGISTER_USER_FAILURE,
        messages: error.response.data,
      });
    }
  }
};
然后,您可以使用一种React生命周期方法来检查redux更改中的状态。假设代码段正在使用react-redux和
connect

你可能也想考虑一下。

使用React lifecycle方法的另一种选择是使用类似的方法,它可以在
成功
失败
操作上发出信号,并代表您执行history.push

如果您还没有这样做,您可能还想看看。它提供了访问历史记录和管理路由的方法

async/await的要点是在您的示例中不必使用嵌套的承诺链

您的try/catch块相当于您的then/catch。因此,如果您想在响应为400时使用上面的函数并捕获它,您需要删除try catch并处理
onRegisterUser
中的错误(不推荐),或者需要重新抛出,以便在调用
registerUser
时调用
catch

下面是一个关于
registerUser
的示例,它在响应失败时应该返回一个catch

export const registerUser = registeredUserData => async dispatch => {
  try {
    const response = await axios.post('/users/register', registeredUserData);
    await dispatch({
      type: REGISTER_USER,
      messages: response.data,
    });
  } catch (error) {
    if (error.response) {
      await dispatch({
        type: REGISTER_USER,
        messages: error.response.data,
        isError: true,
      });
      throw new Error(error.response.data);
    }
  }
};

您可能希望通过装饰错误对象,用更具体的内容替换抛出新错误(Error.response.data)

在您的示例中,您的操作
registerUser
是一个承诺,因为它是一个
异步
函数。因此,您可以将您的
onRegisterUser
重写为如下所示:

const onRegisterUser = (e) => {
    e.preventDefault();
    registerUser(registeredUserData)
        .then(() => /* success */)
        .catch(error => /* handle my failure */)
};
export const registerUser = registeredUserData => async dispatch => {
  try {
    const response = await axios.post('/users/register', registeredUserData);
    dispatch({
      type: REGISTER_USER_SUCCESS,
      messages: response.data,
    });
  } catch (error) {
    if (error.response) {
      dispatch({
        type: REGISTER_USER_FAILURE,
        messages: error.response.data,
      });
    }
  }
};
<>你可能想考虑创建<代码>成功< /代码>和<代码>失败<代码>网络调用的动作。这允许您根据注册用户api调用潜在地更新redux的状态

您可以将thunk修改为如下所示:

const onRegisterUser = (e) => {
    e.preventDefault();
    registerUser(registeredUserData)
        .then(() => /* success */)
        .catch(error => /* handle my failure */)
};
export const registerUser = registeredUserData => async dispatch => {
  try {
    const response = await axios.post('/users/register', registeredUserData);
    dispatch({
      type: REGISTER_USER_SUCCESS,
      messages: response.data,
    });
  } catch (error) {
    if (error.response) {
      dispatch({
        type: REGISTER_USER_FAILURE,
        messages: error.response.data,
      });
    }
  }
};
然后,您可以使用一种React生命周期方法来检查redux更改中的状态。假设代码段正在使用react-redux和
connect

你可能也想考虑一下。

使用React lifecycle方法的另一种选择是使用类似的方法,它可以在
成功
失败
操作上发出信号,并代表您执行history.push

如果您还没有这样做,您可能还想看看。它提供了访问历史记录和管理路由的方法

async/await的要点是在您的示例中不必使用嵌套的承诺链

您的try/catch块相当于您的then/catch。因此,如果您想在响应为400时使用上面的方法并捕获它,您需要删除try catch并在
onRegisterUser
中处理错误(不推荐),或者