【问题标题】:React Axios double form submitReact Axios 双表单提交
【发布时间】:2021-02-04 22:11:29
【问题描述】:

我正在构建一个 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')
    );
}

【问题讨论】:

  • 在另一个 SO 用户的提示和对 React Hook Forms 的一些研究之后,您的代码工作得很好,只需触发一次您的请求。我建议在 PHP 端寻找错误。
  • 检查你的 php 代码的 header('Access-Control-Allow-Origin: *');我有类似的情况,删除这个标题解决了它
  • @user9330552 我添加了 PHP 代码。可以看看吗?

标签: reactjs axios


【解决方案1】:

添加禁用={formState.isSubmitting}>

<button type="submit" disabled={formState.isSubmitting}> className="submit" name="submit" id="submit"><BsArrowRight className="submit-arrow" /></button>

【讨论】:

  • 当我删除标题时,它不允许我发帖,当我提供来源时,它仍然发双倍。
  • 所以取回你的标题,并使用第二段代码
  • 对不起,还是一样:(
猜你喜欢
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 2011-11-26
  • 2018-01-23
  • 2019-06-21
相关资源
最近更新 更多