Reactjs 在React中成功调用操作后,如何从组件重定向?
我在redux中的操作中调用了一个APIReactjs 在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) {
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)
来确认这一点
为了实现这一点,我建议将其作为回调发送到您的actionregisterUser
,以便执行以下操作:
- 将
cb
添加到您的操作中:
- 对于:
onRegisterUser
:
希望它能起作用,如果它不起作用,请描述它的行为。你好,艾伦,
基本上,您可以从路由器
获得this.props.history.push,该路由器将其传递给应用程序中的所有路由
组件
您可以通过该组件的render
方法中的console.log(“\uuu-props\uuuuuu”,this.props)
来确认这一点
为了实现这一点,我建议将其作为回调发送到您的actionregisterUser
,以便执行以下操作:
- 将
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
中处理错误(不推荐),或者