reactjs - React Axios 双表单提交
问题描述
我正在构建一个 React + PHP API 应用程序,让页面的访问者订阅时事通讯。我也在使用 Hooks、Axios 和 Typescript。我用 Postman 测试了 API,数据按应有的方式提交。但是当我从前端发帖时,数据过来并被插入到数据库中两次——一个正常行和一个空行。
我的前端代码
import React, { FormEvent } from 'react';
import { useForm } from "react-hook-form";
import axios from 'axios';
import { BsArrowRight } from 'react-icons/bs';
interface IFormNewsletter {
email: string;
emailProvider: string;
dateCreated: number;
}
const FormNewsletter: React.FC = () => {
const { register, handleSubmit } = useForm<IFormNewsletter>();
const preventDefault = (e: FormEvent) => {
e.preventDefault();
}
const onSubmit = (data: IFormNewsletter) => {
data.emailProvider = data.email.split('@')[1];
data.dateCreated = Math.round((new Date()).getTime() / 1000);
axios.post('http://localhost/mb-backend/api/create', {
email: data.email,
emailProvider: data.emailProvider,
dateCreated: data.dateCreated
})
.then((response) => {
console.log(response);
}, (error) => {
console.log(error);
});
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<div className="input-box">
<input ref={register} className="newsletter" type="text" name="email" id="email" placeholder="Type your email address here…" />
<button type="submit" className="submit" name="submit" id="submit"><BsArrowRight className="submit-arrow" /></button>
</div>
<div className="tos-box">
<label className="check-container">
<input type="checkbox" />
<span className="checkmark"></span>
</label>
<span className="tos-label">I agree to <a href="#">terms of service</a></span>
</div>
</form>
)
}
export default FormNewsletter;
我尝试的是使用该preventDefault
方法,但它完全阻止了表单提交:
<form onSubmit={(e) => {
e.preventDefault();
handleSubmit(onSubmit);
}}>
我也尝试使用fetch
,axios
但结果是一样的。我是 React 新手,希望能得到帮助。
编辑:
后端看起来像这样:
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Allow-Headers: Access-Control-Allow-Headers,Content-Type,Access-Control-Allow-Methods,Authorization,X-Requested-With');
include_once '../config/Database.php';
include_once '../models/User.php';
$database = new Database();
$db = $database->connect();
$user = new User($db);
$data = json_decode(file_get_contents("php://input"));
$user->dateCreated = $data->dateCreated;
$user->email = $data->email;
$user->emailProvider = $data->emailProvider;
if ($user->create()) {
echo json_encode(
array('message' => 'User created')
);
} else {
echo json_encode(
array('message' => 'Could not create user')
);
}
解决方案
添加禁用={formState.isSubmitting}>
<button type="submit" disabled={formState.isSubmitting}> className="submit" name="submit" id="submit"><BsArrowRight className="submit-arrow" /></button>
推荐阅读
- linux - 使用 hadoop distcp 在 Hadoop 集群上复制数据时排除一些目录
- .net - “字符串”类型的值无法转换为“附件” System.Net.Mail
- wagtail - Wagtail 管理员:仅显示某些组中的用户?
- electron - TypeError:在电子打包期间无法读取未定义的属性“getAppPath”
- python - 将 IBM Cloudant 与 SQLAlchemy 结合使用
- java - 如何在 android studio 上为 Android Apk 文件生成 SHA512 校验和
- windows - .Net Core windows 身份验证,并在应用程序数据库中进行一些额外检查
- c++ - 跨解决方案项目共享 C++ 源文件以供模板使用
- jsf - javax.faces.webapp.FacesServlet 不能分配给 javax.servlet.Servlet , jakarta.servlet.Servlet
- nlp - 您如何确保节 CoreNLPClient 的可行端点?