我正在开发一个简单的形式发送消息到我的邮箱与EmailJS的帮助.EmailJS个设置看起来很好,我通过网站测试了它们,我得到了200个响应.

这是我的代码:

"use client";

import { Button } from "./ui/button";
import { Input } from "./ui/input";
import { Textarea } from "./ui/textarea";
import { User, MailIcon, ArrowRightIcon, MessageSquare } from "lucide-react";
import emailjs from "@emailjs/browser";
import { ChangeEvent, FormEvent, useRef, useState } from "react";

const Form = () => {
  const formRef = useRef<HTMLFormElement>(null);
  const [form, setForm] = useState({
    name: "",
    email: "",
    message: "",
  });

  const handleChange = (
    e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>
  ) => {
    const { name, value } = e.target;

    setForm({ ...form, [name]: value });
  };

  const handleSubmit = (e: FormEvent<HTMLFormElement>) => {
    e.preventDefault();

    console.log("Dati del form:", form); // Verifica i dati del form nel log

    emailjs
      .send(
        "service_+++++",
        "template_++++++",
        {
          from_name: form.name,
          to_name: "Jhon Doe",
          from_email: form.email,
          to_email: "jhondoe1@gmail.com",
          message: form.message,
        },
        "WYI3ob++++++++"
      )
      .then(
        () => {
          alert("Thank you for your message!");

          setForm({
            name: "",
            email: "",
            message: "",
          });
        },
        (error: Error) => {
          console.log(error);
          alert("Something went wrong");
        }
      );
  };

  return (
    <form
      ref={formRef}
      onSubmit={handleSubmit}
      className="flex flex-col gap-y-4"
    >
      <div className="relative flex items-center">
        <Input
          onChange={handleChange}
          type="text"
          id="name"
          placeholder="Name"
          required
          value={form.name}
        />
        <User className="absolute right-6" size={20} />
      </div>
      <div className="relative flex items-center">
        <Input
          onChange={handleChange}
          type="email"
          id="email"
          placeholder="Email"
          required
          value={form.email}
        />
        <MailIcon className="absolute right-6" size={20} />
      </div>
      <div className="relative flex items-center">
        <Textarea
          onChange={handleChange}
          required
          placeholder="Type your message"
          value={form.message}
        />
        <MessageSquare className="absolute top-4 right-6" size={20} />
      </div>

      <Button className="flex items-center gap-x-1 max-w-[166px] rounded-[80px]">
        Let&apos; s Talk
        <ArrowRightIcon size={20} />
      </Button>
    </form>
  );
};

export default Form;

现在我无法在input个字符串中输入任何东西,甚至无法复制,就像它们被困在空字符串的初始状态.

我也使用了shadcn,事实上,InputTextArea的成分来自那里.有谁知道我为什么会面临这个问题?

我也试着使用普通的inputtext area,但我仍然不能输入任何输入.

我也试着使用defaultValues,在这种情况下,我可以输入输入,但带有nameemailmessage的对象仍然是空字符串.

推荐答案

您遇到的问题可能是由于您处理<Input /><Textarea />组件中的id属性的方式,而没有正确地将name属性与表单的状态相关联.

为了让useState钩子根据输入的更改正确地更新状态,您需要确保每个输入的name属性与状态对象中的键相匹配.

在代码中,您为<Input /><Textarea />设置了id属性,但没有设置它们的name属性,这对于handleChange函数根据输入的更改正确更新状态至关重要.

handleChange函数使用name属性来确定要更新状态的哪一部分.

以下是基于您共享代码的更新return ()函数:

  return (
    <form
      ref={formRef}
      onSubmit={handleSubmit}
      className="flex flex-col gap-y-4"
    >
      <div className="relative flex items-center">
        <Input
          name="name" // Add the name attribute
          onChange={handleChange}
          type="text"
          id="name"
          placeholder="Name"
          required
          value={form.name}
        />
        <User className="absolute right-6" size={20} />
      </div>
      <div className="relative flex items-center">
        <Input
          name="email" // Add the name attribute
          onChange={handleChange}
          type="email"
          id="email"
          placeholder="Email"
          required
          value={form.email}
        />
        <MailIcon className="absolute right-6" size={20} />
      </div>
      <div className="relative flex items-center">
        <Textarea
          name="message" // Add the name attribute
          onChange={handleChange}
          required
          placeholder="Type your message"
          value={form.message}
        />
        <MessageSquare className="absolute top-4 right-6" size={20} />
      </div>

      <Button className="flex items-center gap-x-1 max-w-[166px] rounded-[80px]">
        Let&apos; s Talk
        <ArrowRightIcon size={20} />
      </Button>
    </form>
  );

Reactjs相关问答推荐

在此上下文中如何在缓冲(隐藏)视频和渲染视频之间切换?

react应用程序中的字体不适用于.scss扩展名

如何使用React Router创建响应式主详细信息应用程序?

无法使用Apollo客户端GraphQL设置Next.js 14

react 路由导航不工作,但手动路由工作

两条react 路由的行为不同.有没有人能解释一下,我已经找了好几天了

如何在React中的textarea中显示字符数?

梅X折线图无响应

如何通过reactjs正确显示记录

React 错误: 只能用作 元素的子元素,从不直接渲染.请将您的 包裹在

MERN,将动态列表中的元素插入数组

Reactjs:MUI5:MobileDateTimePicker API:如何自定义日历中的文本

ReactJS on AWS Amplify与EC2上的Spring boot服务之间的混合内容错误

无法读取未定义的属性(阅读 'editQuoteModalShown')reactredux

无法在react 中向表中添加行

React - 拖放 UML

如何使用 React Router 在 React 中正确同步 useEffect 和 useLocation 挂钩?

如何在 React 中的 Material Ui 多选中设置默认值?

当页面重新加载react 路由导航到第一页 v6

Context Api React 的问题