【React】详解受控表单绑定

文章目录

    • 一、受控组件的基本概念
      • 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>名字:<inputtype="text"name="firstName"value={formValues.firstName}onChange={handleChange}/></label><br /><label>姓氏:<inputtype="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>名字:<inputtype="text"name="firstName"value={formValues.firstName}onChange={handleChange}/></label><br /><label>姓氏:<inputtype="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.xdnf.cn/news/1489306.html

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

相关文章

拉提查合创5步玩转git工具协作代码开发

1 工具使用场景 开发团队使用git版本管理工具&#xff0c;进行协作代码开发过程中&#xff0c;最常用的场景为&#xff1a; &#xff08;1&#xff09;拉取代码 将git远端仓库最新代码拉取到本地。 &#xff08;2&#xff09;提交代码 将本地新增修改的代码提交至git远端仓库中…

Django项目中报错:django.template.exceptions.TemplateDoesNotExist: index.html

访问127.0.0.1&#xff1a;8000访问出错 查看报错原因 到Django项目当中找到settings.py&#xff0c;找到TEMPLATES中的DIRS: 添加如下代码&#xff0c;并导入OS模块&#xff1a; "DIRS": [os.path.join(BASE_DIR,templates)] 再次访问IP地址&#xff1a;

Shell编程之正则表达式与文本三剑客

目录 一、正则表达式 1.引言--什么是正则表达式 1.1正则表达式的功能 2.基础正则表达式&#xff08;BRE&#xff09; 2.1特殊字符 2.2定位符 2.3非打印字符 3.扩展正则表达式(ERE) 4.元字符操作的案列 二、命令小工具 1.cut&#xff1a;列截取工具 2.sort排序 …

Footprint Analytics 助力 Core 区块链实现数据效率突破

Core 是一个基于比特币并兼容 EVM 的 Layer 1 区块链&#xff0c;正通过其创新解决方案引革新特币金融。作为首个引入非托管 BTC 质押协议及全球首个发行收益型 BTC ETP 产品的区块链&#xff0c;Core 站在了区块链技术的最前沿。通过利用超过 50% 的比特币挖矿哈希算力&#x…

SQL Server 设置端口号:详细步骤与注意事项

目录 一、了解SQL Server端口号的基础知识 1.1 默认端口号 1.2 静态端口与动态端口 二、使用SQL Server配置管理器设置端口号 2.1 打开SQL Server配置管理器 2.2 定位到SQL Server网络配置 2.3 修改TCP/IP属性 2.4 重启SQL Server服务 三、注意事项 3.1 防火墙设置 3…

《GPT-4o mini:开启开发与创新的新纪元》

在科技发展的快速进程中&#xff0c;OpenAI 推出的 GPT-4o mini 模型如同一阵春风&#xff0c;给开发者们带来了新的希望和机遇。它以其卓越的性能和极具吸引力的价格&#xff0c;成为了行业内热议的焦点。 当我首次听闻 GPT-4o mini 的消息时&#xff0c;内心充满了好奇与期待…

【Gin】Gin框架性能优化:精进应用效率与稳定性的对象池策略(上)

【Gin】Gin框架性能优化&#xff1a;精进应用效率与稳定性的对象池策略(上) 大家好 我是寸铁&#x1f44a; 【Gin】Gin框架性能优化&#xff1a;精进应用效率与稳定性的对象池策略(上)✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 本次文章分为上下两部分&#xff0c;上部…

C++初学(2)

2.1、其他简单C语句例子 下面这个程序要求运行时输入值 #include <iostream> int main() {using namespace std;int yuanshi;cout << "How many yuanshi do you have?" << endl;cin >> yuanshi;cout << "Here are two more.&q…

过某开源滑动验证码

过某开源滑动验证码 今天早上我有一点空闲时间&#xff0c;想着回顾一下前几天在某查询网站遇到的滑动验证码&#xff0c;以免时间久了忘记了。那个网站可能使用的是较早版本的开源滑块验证码系统tianai-captcha&#xff0c;但我不确定是否正确。 整体思路&#xff1a; 获取…

开始尝试从0写一个项目--前端(三)

器材管理板块 添加器材管理导航 src\views\home\Home.vue src\router\index.js src\views\equipment\Equipment.vue <template><div>hello!</div></template> 测试 搜索导航分页查询 src\views\equipment\Equipment.vue <template><div&…

【React】详解 Redux 状态管理

文章目录 一、Redux 的基本概念1. 什么是 Redux&#xff1f;2. Redux 的三大原则 二、Redux 的核心组件1. Store2. Action3. Reducer 三、Redux 的使用流程1. 安装 Redux 及其 React 绑定2. 创建 Action3. 创建 Reducer4. 创建 Store5. 在 React 应用中使用 Store6. 连接 React…

Apache Flink窗口详解

Apache Flink窗口详解 Apache Flink 的核心功能之一是窗口处理&#xff0c;它允许开发人员以基于时间或基于计数的方式分组和处理数据流。 窗口技术是一种根据某些标准将数据流划分为有限块&#xff08;称为窗口&#xff09;的技术。 窗口&#xff08;Window&#xff09;是处…

活动报名小程序

#活动报名工具# # 活动报名小程序 ## 项目简介 一款通用的活动报名工具&#xff0c;包含活动展示&#xff0c;微信支付&#xff0c;订单管理&#xff0c;分享评价等功能。 品客聚精彩&#xff0c;有你才精彩&#xff01;不只有线下活动还可以进行线上裂变活动。 …

HTTP ESP8266 获取天气请求 单片机,嵌入式 2024/7/26 日志

通过http请求获取天气信息: 这里借鉴一下 中国气象局网站举例 首先根据网址 分析: http://weather.cma.cn/ 通过vscode插件:REST Client 发送请求我们会得到内容 首先我们的打开浏览器调试工具查看请求格式 筛选以下几个关键的格式,试着用插件发送请求 GET /web/weather…

【项目日记(三)】梦幻笔耕-前端模块

❣博主主页: 33的博客❣ ▶️文章专栏分类:项目日记◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多项目内容 目录 1.前言,2.登录界面3.注册界面4.博客列表界面5.博客编辑页6.博客详情页7.博客更新界面…

Java 8 中 20 个高频面试题及答案

文章目录 前言20 道高频题问题 1&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出列表中所有的偶数&#xff1f;问题 2&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出所有以 1 开头的数字&#xff1f;问题 3&#xff1a;如何使用 Stream 函数在给…

stm32入门-----TIM定时器(输入捕获模式——下)

目录 前言 一、C语言编程初始化步骤 1.开启时钟 2.配置GPIO口 3.配置时基单元 4.配置输入捕获单元&#xff08;主模式&#xff09; 5.配置触发源于从模式 6.开启定时器 二、项目实操&#xff08;测周法&#xff09; 1.定时器测量方波 2.定时器测量方波的占空比 前言 接…

el-table表格 及其el-pagination分页 封装及其使用

1、首页在components文件夹中新建table文件夹 table文件夹下table.vue全部代码&#xff1a; <template><el-table:stripe"stripe":row-key"handlerRowKey()":tree-props"treeProps":border"border":show-summary"showS…

无人机之降落操作及紧急情况处理

一、无人机降落操作 1、选择降落地点 a.提前选择一个平坦且没有障碍物的降落点&#xff1b; b.确认降落点周围没有行人或障碍物&#xff0c;保证降落的安全性。 2、降低飞行高度 a.缓慢降低飞行高度&#xff0c;尽量保持匀速下降&#xff0c;防止因下降过快导致无人机受损…

Android 软键盘挡住输入框

Android原生输入法软键盘挡住输入框,网上各种解法,但不起效。 输入框都是被挡住了,第二张图的小点,实际就是输入法的光标。 解法: packages\inputmethods\LatinIME\java\res\values-land config.xml <!-- <fraction name="config_min_keyboard_height"&g…