【React】详解受控表单绑定

news2024/11/25 16:37:11

文章目录

    • 一、受控组件的基本概念
      • 1. 什么是受控组件?
      • 2. 受控组件的优势
      • 3. 基本示例
        • 导入和初始化
        • 定义函数组件
        • 处理输入变化
        • 处理表单提交
        • 渲染表单
        • 导出组件
    • 二、受控组件的进阶用法
      • 1. 多个输入框的处理
        • 使用多个状态变量
        • 使用一个对象管理状态
      • 2. 处理选择框(select)和复选框(checkbox)
        • 选择框
        • 复选框
    • 三、受控组件的常见问题
      • 1. 表单重置
      • 2. 实时校验

在React开发中,表单是非常常见的需求。为了实现表单的灵活控制和状态管理,受控组件的使用尤为重要。本文将深入探讨React中受控表单的绑定方法,包括基本用法、常见问题以及高级应用。通过本文,你将全面了解如何在React中使用受控表单,从而提升表单处理的效率和用户体验。

一、受控组件的基本概念

1. 什么是受控组件?

受控组件是指表单元素的值由React组件的状态控制,而不是由DOM自己维护。通过在组件状态和表单元素之间建立绑定,React可以完全控制表单的行为和显示内容。

2. 受控组件的优势

  • 单一数据源:表单数据和组件状态保持同步,数据源统一,便于管理。
  • 实时校验:可以在用户输入时进行实时校验,提升用户体验。
  • 便于调试:状态可控,便于调试和测试。

3. 基本示例

以下是一个简单示例,展示如何使用受控组件来处理表单输入:

import React, { useState } from 'react';

function ControlledForm() {
  const [inputValue, setInputValue] = useState('');

  const handleChange = (event) => {
    setInputValue(event.target.value);
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    alert(`提交的值: ${inputValue}`);
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        输入:
        <input type="text" value={inputValue} onChange={handleChange} />
      </label>
      <button type="submit">提交</button>
    </form>
  );
}

export default ControlledForm;

在上述示例中,inputValue的状态由React组件的状态管理,handleChange函数更新状态,使输入框的值与状态保持同步。

导入和初始化
import React, { useState } from 'react';

这行代码从react库中导入ReactuseStateuseState是一个React Hook,用于在函数组件中添加状态。

定义函数组件
function ControlledForm() {
  const [inputValue, setInputValue] = useState('');

ControlledForm是一个函数组件。组件内部使用useState Hook 创建了一个名为inputValue的状态变量和一个更新状态的函数setInputValue。初始状态为一个空字符串。

处理输入变化
const handleChange = (event) => {
  setInputValue(event.target.value);
};

handleChange是一个事件处理函数,用于处理输入框内容的变化。它接受一个事件对象event作为参数,通过event.target.value获取输入框的当前值,并使用setInputValue更新组件的状态。

处理表单提交
const handleSubmit = (event) => {
  event.preventDefault();
  alert(`提交的值: ${inputValue}`);
};

handleSubmit是一个事件处理函数,用于处理表单的提交。它接受一个事件对象event作为参数,并调用event.preventDefault()阻止默认的表单提交行为。然后,通过alert函数弹出一个提示框,显示当前的输入值inputValue

渲染表单
return (
  <form onSubmit={handleSubmit}>
    <label>
      输入:
      <input type="text" value={inputValue} onChange={handleChange} />
    </label>
    <button type="submit">提交</button>
  </form>
);

return语句返回JSX,用于渲染表单。表单包含以下几个元素:

  • <form onSubmit={handleSubmit}>:定义一个表单,并将handleSubmit函数绑定到表单的onSubmit事件上。当表单提交时,将调用handleSubmit函数。
  • <label>:定义一个标签,包含一个输入框和说明文字。
    • <input type="text" value={inputValue} onChange={handleChange} />:定义一个文本输入框。value属性绑定到组件的状态inputValue,确保输入框的值始终与状态同步。onChange事件绑定到handleChange函数,当输入框内容变化时,调用handleChange函数更新状态。
  • <button type="submit">提交</button>:定义一个提交按钮。当按钮被点击时,表单将尝试提交,并触发handleSubmit函数。
导出组件
export default ControlledForm;

最后,通过export default导出ControlledForm组件,使其可以在其他文件中导入和使用。

二、受控组件的进阶用法

1. 多个输入框的处理

在实际应用中,表单往往包含多个输入框。可以通过使用多个状态变量或一个对象来管理多个输入框的值。

使用多个状态变量
import React, { useState } from 'react';

function MultiInputForm() {
  const [firstName, setFirstName] = useState('');
  const [lastName, setLastName] = useState('');

  const handleFirstNameChange = (event) => {
    setFirstName(event.target.value);
  };

  const handleLastNameChange = (event) => {
    setLastName(event.target.value);
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    alert(`提交的值: ${firstName} ${lastName}`);
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        名字:
        <input type="text" value={firstName} onChange={handleFirstNameChange} />
      </label>
      <br />
      <label>
        姓氏:
        <input type="text" value={lastName} onChange={handleLastNameChange} />
      </label>
      <br />
      <button type="submit">提交</button>
    </form>
  );
}

export default MultiInputForm;
使用一个对象管理状态
import React, { useState } from 'react';

function MultiInputForm() {
  const [formValues, setFormValues] = useState({ firstName: '', lastName: '' });

  const handleChange = (event) => {
    const { name, value } = event.target;
    setFormValues({
      ...formValues,
      [name]: value,
    });
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    alert(`提交的值: ${formValues.firstName} ${formValues.lastName}`);
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        名字:
        <input
          type="text"
          name="firstName"
          value={formValues.firstName}
          onChange={handleChange}
        />
      </label>
      <br />
      <label>
        姓氏:
        <input
          type="text"
          name="lastName"
          value={formValues.lastName}
          onChange={handleChange}
        />
      </label>
      <br />
      <button type="submit">提交</button>
    </form>
  );
}

export default MultiInputForm;

状态初始化

const [formValues, setFormValues] = useState({ firstName: '', lastName: '' });
  • useState Hook 用于声明组件的状态变量formValues,它是一个对象,包含两个属性:firstNamelastName,初始值均为空字符串。
  • setFormValues 是更新状态的函数。

处理输入变化的函数

const handleChange = (event) => {
  const { name, value } = event.target;
  setFormValues({
    ...formValues,
    [name]: value,
  });
};
  • handleChange 是一个事件处理函数,当输入字段的值发生变化时调用。

  • event 是事件对象,其中event.target指向触发事件的元素(即输入字段)。

  • { name, value } = event.target 是使用解构赋值从event.target中提取name

    value属性。

    • name 是输入字段的名称属性,对应formValues中的键(即firstNamelastName)。
    • value 是输入字段的当前值。
  • setFormValues函数使用展开运算符...复制formValues对象的现有属性,并更新对应输入字段的值:

    • 这样做的目的是保持 formValues 中现有的其他属性不变,仅更新需要修改的属性。
    • [name]: value 动态地根据输入字段的名称属性设置formValues对象中的值。

处理表单提交的函数

const handleSubmit = (event) => {
  event.preventDefault();
  alert(`提交的值: ${formValues.firstName} ${formValues.lastName}`);
};
  • handleSubmit 是一个事件处理函数,当表单被提交时调用。
  • event.preventDefault() 用于阻止表单的默认提交行为,以便在JavaScript中处理表单数据。
  • alert 函数弹出一个对话框,显示提交的firstNamelastName值。

2. 处理选择框(select)和复选框(checkbox)

受控组件不仅适用于文本输入框,还可以用于选择框和复选框。

选择框
import React, { useState } from 'react';

function SelectForm() {
  const [selectedValue, setSelectedValue] = useState('option1');

  const handleChange = (event) => {
    setSelectedValue(event.target.value);
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    alert(`选择的值: ${selectedValue}`);
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        选择:
        <select value={selectedValue} onChange={handleChange}>
          <option value="option1">选项1</option>
          <option value="option2">选项2</option>
          <option value="option3">选项3</option>
        </select>
      </label>
      <button type="submit">提交</button>
    </form>
  );
}

export default SelectForm;
复选框
import React, { useState } from 'react';

function CheckboxForm() {
  const [isChecked, setIsChecked] = useState(false);

  const handleChange = (event) => {
    setIsChecked(event.target.checked);
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    alert(`复选框状态: ${isChecked}`);
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        复选框:
        <input type="checkbox" checked={isChecked} onChange={handleChange} />
      </label>
      <button type="submit">提交</button>
    </form>
  );
}

export default CheckboxForm;

三、受控组件的常见问题

1. 表单重置

在某些情况下,我们需要在表单提交后重置表单的状态。可以通过将状态重置为初始值来实现。

import React, { useState } from 'react';

function ResettableForm() {
  const initialFormState = { firstName: '', lastName: '' };
  const [formValues, setFormValues] = useState(initialFormState);

  const handleChange = (event) => {
    const { name, value } = event.target;
    setFormValues({
      ...formValues,
      [name]: value,
    });
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    alert(`提交的值: ${formValues.firstName} ${formValues.lastName}`);
    setFormValues(initialFormState); // 重置表单
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        名字:
        <input
          type="text"
          name="firstName"
          value={formValues.firstName}
          onChange={handleChange}
        />
      </label>
      <br />
      <label>
        姓氏:
        <input
          type="text"
          name="lastName"
          value={formValues.lastName}
          onChange={handleChange}
        />
      </label>
      <br />
      <button type="submit">提交</button>
    </form>
  );
}

export default ResettableForm;

2. 实时校验

在表单中进行实时校验可以提高用户体验,防止提交无效数据。

import React, { useState } from 'react';

function ValidatedForm() {
  const [email, setEmail] = useState('');
  const [error, setError] = useState('');

  const handleChange = (event) => {
    const value = event.target.value;
    setEmail(value);
    if (!/\S+@\S+\.\S+/.test(value)) {
      setError('无效的邮箱地址');
    } else {
      setError('');
    }
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    if (!error) {
      alert(`提交的邮箱: ${email}`);
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        邮箱:
        <input type="email" value={email} onChange={handleChange} />
      </label>
      <br />
      {error && <p style={{ color: 'red' }}>{error}</p>}
      <button type="submit" disabled={!!error}>
        提交
      </button>
    </form>
  );
}

export default ValidatedForm;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1952554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode-104. 二叉树的最大深度

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,n…

24款美规奔驰GLS450更换中规高配主机系统,提升车辆功能和使用体验

平行进口奔驰GLS450 语音小助手要说英语 十分的麻烦 而且也没有导航&#xff0c;原厂记录仪也减少了 很不方便 那要怎么解决呢 往下看 其实很简单&#xff0c;我们只需要更换一台中规的新主机就可以实现以下功能&#xff1a; ①中国地图 ②语音小助手&#xff08;你好&#…

C++编译jsoncpp库

下载https://github.com/hailong0715/jsoncpp/tree/master windows编译工程 jsoncpp-master\makefiles\vs71 1.msvcprtd.lib(MSVCP140D.dll) : error LNK2005 解决办法&#xff1a; (1).工程(Project)->属性(Properties)->配置属性(Configuration Properties)->c/c-…

OZON打开哈萨克斯坦市场,OZON测试开通哈萨克斯坦市场中国产品

在全球化日益深入的今天&#xff0c;跨境电商成为了连接不同国家和地区消费者的重要桥梁。2024年7月26日&#xff0c;Ozon Global宣布了一项重大扩展计划&#xff0c;正式将中国卖家的销售版图拓展至哈萨克斯坦市场&#xff0c;为中国企业打开了新的增长机遇之门。 OZON哈萨克斯…

2024AGI面试官 常问的问题以及答案(附最新的AI大模型算法面试大厂必考100题 )

前言 在这个人工智能飞速发展的时代&#xff0c;AI大模型已经成为各行各业创新与变革的重要驱动力。从自动驾驶、医疗诊断到金融分析&#xff0c;AI大模型的应用场景日益广泛&#xff0c;为我们的生活带来了前所未有的便捷。作为一名程序员&#xff0c;了解并掌握AI大模型的相…

移植QT项目出现无法找到 v143 的生成工具(平台工具集 =“v143”)。若要使用 v143 生成工具进行生成,请安装 v143 生成工具。

由于使用的是visual studio2019&#xff0c;在扩展里没找到msvc v143的工具集&#xff0c;这时候可能需要升级下版本&#xff0c;比如换用visual studio2022 或者在三个地方更改所使用的工具集&#xff0c;一般来讲只要v143编译能通过的v142编译也能通过&#xff0c;所以换用v…

ctfshow-web入门-php特性(web147-web150_plus)

目录 1、web147 2、web148 3、web149 4、web150 5、web150_plus 1、web147 ^&#xff1a;匹配字符串的开头。 $&#xff1a;匹配字符串的结尾&#xff0c;确保整个字符串符合规则。 [a-z0-9_]&#xff1a;表示允许小写字母、数字和下划线。 *&#xff1a;匹配零个或多个前面…

c++入门----类与对象(中)

OK呀&#xff0c;家人们承接上文&#xff0c;当大家看过鄙人的上一篇博客后&#xff0c;我相信大家对我们的c已经有一点印象了。那么我们现在趁热打铁再深入的学习c入门的一些知识。 类的默认成员函数 首先我们学习的是我们的默认函数。不知道大家刚读这个名词是什么反应。默认…

一下午连续故障两次,谁把我们接口堵死了?!

唉。。。 大家好&#xff0c;我是程序员鱼皮。又来跟着鱼皮学习线上事故的处理经验了喔&#xff01; 事故现场 周一下午&#xff0c;我们的 编程导航网站 连续出现了两次故障&#xff0c;每次持续半小时左右&#xff0c;现象是用户无法正常加载网站&#xff0c;一直转圈圈。 …

2020 CSP第一题:数字拆分

2020 CSP第一题&#xff1a;数字拆分 示例1 输入 6 输出 4 2 题意&#xff1a; 实质就是将一个偶数转化为二进制数&#xff0c;然后分别用十进制逆序输出每一项 数据约束&#xff1a; n最大在10的七次方左右&#xff0c;int类型够了&#xff0c;十进制转化为二进制后&#x…

重生之“我打数据结构,真的假的?”--3.栈和队列

1.栈和队列的基本概念 1.1 栈 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则…

鸿蒙开发——axios封装请求、拦截器

描述&#xff1a;接口用的是PHP&#xff0c;框架TP5 源码地址 链接&#xff1a;https://pan.quark.cn/s/a610610ca406 提取码&#xff1a;rbYX 请求登录 HttpUtil HttpApi 使用方法

开源模型应用落地-LangChain实用小技巧-ChatPromptTemplate的partial方法(一)

一、前言 在当今的自然语言处理领域&#xff0c;LangChain 框架因其强大的功能和灵活性而备受关注。掌握一些实用的小技巧&#xff0c;能够让您在使用 LangChain 框架时更加得心应手&#xff0c;从而更高效地开发出优质的自然语言处理应用。 二、术语 2.1.LangChain 是一个全方…

TCP/IP协议(全的一b)应用层,数据链层,传输层,网络层,以及面试题

目录 TCP/IP协议介绍 协议是什么,有什么作用? 网络协议为什么要分层 TCP/IP五层网络协议每层的作用 应⽤层 DNS的作用及原理 DNS工作流程 数据链路层 以太⽹帧格式 MAC地址的作用 ARP协议的作⽤ ARP协议的工作流程 MTU以及MTU对 IP / UD / TCP 协议的影响 传输层…

MySQL(持续更新中)

第01章_数据库概述 1. 数据库与数据库管理系统 1.1 数据库相关概念 DB&#xff1a;数据库&#xff08;Database&#xff09;即存储数据的“仓库”&#xff0c;其本质是一个文件系统。它保存了一系列有组织的数据DBMS&#xff1a;数据库管理系统&#xff08;Database Manageme…

2024年【广东省安全员B证第四批(项目负责人)】考试报名及广东省安全员B证第四批(项目负责人)模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员B证第四批&#xff08;项目负责人&#xff09;考试报名根据新广东省安全员B证第四批&#xff08;项目负责人&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将广东省安全员B证第四批&#x…

AFast and Accurate Dependency Parser using Neural Networks论文笔记

基本信息 作者D Chendoi发表时间2014期刊EMNLP网址https://emnlp2014.org/papers/pdf/EMNLP2014082.pdf 研究背景 1. What’s known 既往研究已证实 传统的dp方法依存句法分析特征向量稀疏&#xff0c;特征向量泛化能力差&#xff0c;特征计算消耗大&#xff0c;并且是人工构…

UE5 with plugins AirSim in Windows ROS in WSL2-Ubuntu 20.04配置过程记录

一、概述 因为需要使用到Windows系统下的UE5和插件AirSIm进行研究&#xff0c;所以在Windows环境下进行配置。但又因为需要使用到ros进行操作&#xff0c;所以&#xff0c;在通过对诸多资源进行考察过后&#xff0c;因为UE5plugins AirSim已经配置成功。只需要考虑跟ROS的通信以…

构建查询洞察 UI

本文字数&#xff1a;2631&#xff1b;估计阅读时间&#xff1a;7 分钟 作者&#xff1a;Bucky Schwarz 本文在公众号【ClickHouseInc】首发 我们最近发布了 Query Insights 的初步实现&#xff0c;为 ClickHouse Cloud 用户提供了一种便捷的方法来查看和解释查询日志。该功能对…

CSS 两种盒模型 box-sizing content-box 和 border-box

文章目录 Intro谨记box-sizing 两个不同赋值的效果区别&#xff1f;宽高的数值计算标准盒模型 box-sizing: content-box; box-sizing 属性的全局设置 Intro 先问一句&#xff1a;box-sizing 和它的两个属性值是做什么用的&#xff1f;以前我并不知道它的存在&#xff0c;也做…