3D个人简历网站 7.联系我

3D个人简历网站 7.联系我

修改Contact.jsx

// 从 react 库导入 useRef 和 useState hooks
import { useRef, useState } from "react";

/**
 * Contact 组件,用于展示联系表单,处理用户表单输入和提交。
 * @returns {JSX.Element} 包含联系表单的 JSX 元素
 */
const Contact = () => {
  // 创建一个 ref 对象,用于引用表单元素,方便后续操作
  const formRef = useRef();
  // 使用 useState hook 管理表单数据,初始值为包含姓名、邮箱和消息的空对象
  const [form, setForm] = useState({ name: "", email: "", message: "" });
  // 使用 useState hook 管理表单提交时的加载状态,初始值为未加载
  const [loading, setLoading] = useState(false);

  /**
   * 处理表单输入框内容变化的函数,更新表单数据。
   * @param {Object} e - 事件对象
   * @param {Object} e.target - 触发事件的目标输入框元素
   * @param {string} e.target.name - 输入框的名称
   * @param {string} e.target.value - 输入框的当前值
   */
  const handleChange = ({ target: { name, value } }) => {
    // 扩展原有表单数据,更新当前输入框对应的字段值
    setForm({ ...form, [name]: value });
  };

  /**
   * 处理表单提交的函数,模拟提交操作。
   * @param {Object} e - 事件对象
   */
  const handleSubmit = (e) => {
    // 阻止表单默认提交行为,避免页面刷新
    e.preventDefault();
    // 设置加载状态为 true,显示加载提示
    setLoading(true);

    // 模拟提交操作,这里可以添加实际的提交逻辑
    setTimeout(() => {
      // 打印表单数据到控制台
      console.log("表单已提交:", form);
      // 设置加载状态为 false,隐藏加载提示
      setLoading(false);
      // 重置表单数据
      setForm({ name: "", email: "", message: "" });
    }, 1000);
  };

  return (
    // 外层容器,使用相对定位,根据屏幕尺寸调整布局
    <section className='relative flex flex-col max-container'>
      {/* 表单容器,使用弹性布局 */}
      <div className='flex flex-col'>
        {/* 页面标题 */}
        <h1 className='head-text'>联系我</h1>

        {/* 表单元素,使用 ref 引用,绑定提交事件处理函数 */}
        <form
          ref={formRef}
          onSubmit={handleSubmit}
          className='w-full flex flex-col gap-7 mt-14'
        >
          {/* 姓名输入框标签 */}
          <label className='text-black-500 font-semibold'>
            姓名
            {/* 姓名输入框,设置类型、名称、样式、占位符等属性,绑定值和输入变化事件 */}
            <input
              type='text'
              name='name'
              className='input'
              placeholder='张三'
              required
              value={form.name}
              onChange={handleChange}
            />
          </label>
          {/* 邮箱输入框标签 */}
          <label className='text-black-500 font-semibold'>
            邮箱
            {/* 邮箱输入框,设置类型、名称、样式、占位符等属性,绑定值和输入变化事件 */}
            <input
              type='email'
              name='email'
              className='input'
              placeholder='zhangsan@example.com'
              required
              value={form.email}
              onChange={handleChange}
            />
          </label>
          {/* 消息输入框标签 */}
          <label className='text-black-500 font-semibold'>
            您的留言
            {/* 消息输入框,设置名称、行数、样式、占位符等属性,绑定值和输入变化事件 */}
            <textarea
              name='message'
              rows='4'
              className='textarea'
              placeholder='请在此写下您的想法...'
              value={form.message}
              onChange={handleChange}
            />
          </label>

          {/* 提交按钮,根据加载状态禁用按钮并显示不同文本 */}
          <button
            type='submit'
            disabled={loading}
            className='btn'
          >
            {loading ? "发送中..." : "提交"}
          </button>
        </form>
      </div>
    </section>
  );
};

// 导出 Contact 组件,供其他文件使用
export default Contact;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

90后小陈老师

谢谢你的认可~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值