问题描述
我在reactjs上还很陌生,目前构建了一种表单,该表单可以使用Axiom的POST方法提交给API。
const handleSubmit = (e) => {
e.preventDefault();
const isValid = formValidation()
if (isValid) {
console.log("Form Valid: Processing on Backend")
// const data = new FormData(e.target);
processBackend()
e.preventDefault();
} else {
console.log("Form Invalid: Please check form")
}
}
我的handleSubmit将调用另一个函数processBackend()
const processBackend = async () => {
let res = await postUsers(mobileCountryCode,mobileNumber,firstName,lastName,organization)
// console.log("postUsers.res:")
// console.log(res)
HandleResponse(res)
}
然后我想,我可以使用下面的代码显示功能应用程序,以处理成功或失败的响应。但是,它没有出现。
const HandleResponse = (res) => {
console.log("HandleResponse.res:")
console.log(res)
console.log(res.status)
if (res.status === 200) {
return <ResponseSuccess />
} else if (res.status === 400 || res.status === 403 || res.status === 500) {
return <ResponseError />
} else {
return false
}
}
const ResponseSuccess = () => {
return (
<div className="notification">
<button className="delete"></button>
Successfully processed your request.
</div>
)
}
const ResponseError = () => {
return (
<div className="notification is-danger">
<button className="delete"></button>
There was an error processing your request.
</div>
)
}
我的渲染具有以下内容
return (
<div className="container">
<p> </p>
<h1 className="title">Users</h1>
<h2 className="subtitle">Create New User</h2>
<HandleResponse />
<form onSubmit={handleSubmit}>
我认为问题就在这里
if (res.status === 200) {
return <ResponseSuccess />
} else if (res.status === 400 || res.status === 403 || res.status === 500) {
return <ResponseError />
} else {
return false
}
当我删除return false并仅返回成功或失败时,它会显示出来。但是,在实际的res.status === 200上没有显示。在控制台日志上。我可以看到它实际上是res.status = 200。
非常感谢您的帮助。
解决方法
代码中的问题对
-
对于
HandleResponse()
函数的返回值,您没有做任何事情 -
HandleResponse()
函数被异步调用。从HandleResponse()
函数返回的React组件或任何其他值都不会返回到代码中调用该函数的位置。无法像处理同步函数的返回值那样处理异步函数的返回值。
解决方案:
如果成功响应,则可以在表示HTTP请求成功完成的状态下保存一些值。基于此状态,您可以渲染不同的组件或显示错误消息。
在handleResponse
函数中,根据状态码,更新组件的状态
const HandleResponse = (res) => {
...
if (res.status === 200) {
setState('success');
} else {
setState('error');
}
}
然后在JSX
代码中,根据HTTP请求的响应,呈现适当的组件。
return (
...
{ state == 'success' && <ResponseSuccess/> }
{ state == 'error' && <ResponseError/> }
);
,
HandleResponse
期望有一个参数(res
),但是您永远不会传递它。在当前代码中,HandleResponse
无法知道{{1} }。
如果要保持if语句和HandleResponse组件不变,可以将其更改为以res
作为道具:
res
在渲染器中使用组件时,您需要通过const HandleResponse = ({res}) => /* rest of your code here */
作为道具:
res
您需要更改<HandleResponse res={res} />
,以使其在应用程序状态的某个位置更新processBackEnd
变量,而不是直接调用res
。