javascript - 表单中的提交按钮在第二次单击后起作用。反应JS
问题描述
我正在处理 React 电子商务项目中的表单。
它应该是这样工作的:当用户填写表单并单击提交按钮时,我想将表单数据发布到服务器并将用户重定向到确认/感谢页面。
不幸的是,当我填写表格并单击提交按钮时,以下代码以特定方式工作:
第一次点击 - 它发送数据但“setSubmitted(true)”不起作用所以我没有被重定向
第二次点击 - 再次发送数据,setSubmitted 工作,我被重定向
你能告诉我如何修复代码吗?
let history = useHistory();
const [submitted, setSubmitted] = useState(false);
const handleSubmit = (e) => {
e.preventDefault();
fetch('http://localhost:8000/orders', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ cart: 1 }), //dummy data
})
.then((response) => {
setSubmitted(true);
return response.json();
})
.then(() => {
if (submitted) {
return history.push('/thank-you-page');
}
});
};
return (
<form onSubmit={handleSubmit}> ... </form>
);
解决方案
您需要if statement
从第二个 then(...) 中删除,因为状态更新是异步运行的,并且第一次单击它是false
. 并且当您再次单击提交的表单然后提交时,这次从您的最后一个操作开始为真,并且您重定向了。
还有一个,如果您使用第一个then(...)
块的使用数据返回,您可以将您的代码也重定向到它们并删除第二个。
const handleSubmit = (e) => {
e.preventDefault();
fetch('http://localhost:8000/orders', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ cart: 1 }), //dummy data
})
.then((response) => {
setSubmitted(true);
return history.push('/thank-you-page');
});
};
希望这能解决您的问题。
推荐阅读
- vue.js - 如何找到 Vue Storefront 的管理面板 (CMS)
- java - 考虑在你的配置中定义一个 'org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder' 类型的 bean
- entity-framework - 在 Azure 上,我在 \n 之后有带有额外空格的 JSON 响应
- javascript - 如何检查 MongoDB 中是否已经存在选定的电子邮件和名称
- javascript - 打开开发工具是否触发了事件?
- r - Plotly R:创建分为类别的散点图
- spring-boot - 即使在 Spring Security 中禁用了会话,谷歌应用引擎也会检测到会话管理
- python-3.x - 只读 .txt 文件的 4 个首字母 - Python3
- android - 导航组件:使用 uri 的深层链接,具体取决于 buildType
- ubuntu - 如何在 pam_exec 中获取 SSH 身份验证使用的方法?