reactjs - 在反应组件状态中存储字符串
问题描述
我有一个注册组件,它向 API 发送 POST 请求,如果注册成功,只需向用户显示通知并重定向到登录页面(现在)。如果不是,则服务器发回状态 400 和一条消息。当我收到响应时,我将一个状态变量设置serverError
为 true,并将serverMessage
我从服务器收到的任何内容设置为向用户显示它。
POST请求逻辑:
export const registerRequest = (state, setState) => {
axios.post("api/auth/register", {
"email": state.email, "password": state.password, "firstName": state.firstName, "lastName": state.lastName
}).then((response) => {
if (response.status === 200) {
setState({
...state,
serverError: false
});
}
}).catch((exception) => {
setState({
...state,
serverMessage: exception.response.data,
serverError: true,
});
});
}
首先,我尝试在处理表单提交的函数中执行此“向用户显示出了什么问题”,但我一直得到serverError === true
但serverMessage
等于一个空字符串(如在状态中声明的那样)。所以接下来我尝试使用具有所需依赖项和钩子的componentDidUpdate
等效项,以确保仅在组件更新后(即状态更新后)才显示通知。也没有用。useEffect
didMount
useRef
useEffect
和handleSubmit
钩子/函数(useHistory
来自react-router-dom
并且Notification
是一个带有标题和描述的antD组件):
const { serverError, serverMessage } = state;
const didMountRef = useRef(false);
useEffect(() => {
if (didMountRef.current) {
if (serverError) {
StyleImports.Notification["success"]({
message: [JsonImports.registerNotificationSuccess],
description: [JsonImports.registerSuccessDetails]
});
setTimeout(() => { history.push("/"); }, 4.5 * 1000);
}
else {
StyleImports.Notification["error"]({
message: [JsonImports.registerNotificationFail],
description: serverMessage
});
}
}
else didMountRef.current = true;
}, [serverError, serverMessage, history]);
const handleSubmit = (event) => {
// just some form validation logic before form submission
event.preventDefault();
registerRequest(state, setState);
// commented just to show you what I did initially
/*if (state.serverError) {
StyleImports.Notification["success"]({
message: [JsonImports.registerNotificationSuccess],
description: [JsonImports.registerSuccessDetails]
});
setTimeout(() => { history.push("/"); }, 4.5 * 1000);
}
else {
StyleImports.Notification["error"]({
message: [JsonImports.registerNotificationFail],
description: state.serverMessage
});
}*/
}
关于如何正确处理这个问题的任何想法?在我看来,仅仅显示在 JSON 客户端中声明的一些消息并不是一个好主意,因为我可以从服务器获取不同的消息。我想setState
实际上并没有更新serverMessage
,因为它是一个相当大的字符串并且需要更多时间?
解决方案
这取决于你有什么样的错误以及你从后端得到什么消息。
首先,我建议调试您的exception
财产并查看可用的数据。只需在该行设置一个断点setState({
或在该行之前添加一个console.log(error)
。请检查您的exception
.
在此之后,您可以处理不同的错误情况,例如:
...
.catch(function (error) {
if (error.response) {
// Request made and server responded
console.log(error.response.data);
console.log(error.response.status);
console.log(error.response.headers);
} else if (error.request) {
// The request was made but no response was received
console.log(error.request);
} else {
// Something happened in setting up the request that triggered an Error
console.log('Error', error.message);
}
或者这可能适合您的数据?这一切都取决于你的错误中的内容
.catch(error => {
console.log(error.response.data.error)
})
请也查看axios-handling-error的线程。
顺便说一句,这看起来像一个错误?serverError
也许没有成功;-)
if (serverError) {
StyleImports.Notification["success"]({
推荐阅读
- google-apps-script - 谷歌表格中某些列中的 LastRow
- javascript - 如何在 JavaScript 中获取按钮的对应值?
- c# - 为什么 UnitTest 初始化方法不包含在调用堆栈中?
- sql - 使用 PostgreSQL 获取月份总和
- spring-boot - Jackson 和 Swagger - Set 的默认值
- typescript - 没有'new'就不能调用类构造函数ButtonRenderer
- flutter - 通过 GitLab 管道接受 Flutter Android 许可证失败
- sql - 网关超时前如何优化
- python - 在python中将2D圆盘投影到3D球体中
- android - 如何按时间间隔将传感器信息添加到数据库?