【React】表单

server/2024/10/19 19:39:05/

受控组件

本质上其实就是将表单中的控件和视图模型(状态)进行绑定,之后都是针对状态进行操作。

一个基本的受控组件

文本框,用户输入的内容会在状态中进行管理:

javascript">import React, { useState } from 'react';const ControlledComponent = () => {const [inputValue, setInputValue] = useState('');const handleChange = (event) => {setInputValue(event.target.value);};return (<div><h2>受控组件示例</h2><input type="text" value={inputValue} onChange={handleChange} placeholder="输入内容" /><p>输入的内容:{inputValue}</p></div>);
};export default ControlledComponent;

对用户输入的内容进行限制

限制了用户输入的内容:

javascript">import React, { useState } from 'react';const RestrictedInput = () => {const [inputValue, setInputValue] = useState('');const handleChange = (event) => {const value = event.target.value;// 在这个示例中,我们限制用户输入的内容为纯数字,你可以根据需要修改限制条件const regex = /^[0-9]*$/;if (regex.test(value)) {setInputValue(value);}};return (<div><h2>限制输入的受控组件示例</h2><input type="text" value={inputValue} onChange={handleChange} placeholder="只能输入数字" /><p>输入的内容:{inputValue}</p></div>);
};export default RestrictedInput;

在这个示例中,我们使用了正则表达式来限制用户输入的内容为纯数字。在

文本域

javascript">import React, { useState } from 'react';const ControlledTextarea = () => {const [textareaValue, setTextareaValue] = useState('');const handleChange = (event) => {setTextareaValue(event.target.value);};return (<div><h2>受控文本域示例</h2><textareavalue={textareaValue}onChange={handleChange}placeholder="输入内容"rows={5} // 设置文本域的行数cols={50} // 设置文本域的列数/><p>输入的内容:{textareaValue}</p></div>);
};export default ControlledTextarea;

单选与多选框

以下是单选框和多选框的受控组件示例:

javascript">import React, { useState } from 'react';const ControlledCheckbox = () => {const [isChecked, setIsChecked] = useState(false);const handleCheckboxChange = () => {setIsChecked(!isChecked);};return (<div><h2>单选框示例</h2><label><inputtype="checkbox"checked={isChecked}onChange={handleCheckboxChange}/>是否选中</label><p>选中状态:{isChecked ? '是' : '否'}</p></div>);
};const ControlledRadio = () => {const [selectedOption, setSelectedOption] = useState('option1');const handleOptionChange = (event) => {setSelectedOption(event.target.value);};return (<div><h2>单选按钮示例</h2><label><inputtype="radio"value="option1"checked={selectedOption === 'option1'}onChange={handleOptionChange}/>选项1</label><label><inputtype="radio"value="option2"checked={selectedOption === 'option2'}onChange={handleOptionChange}/>选项2</label><p>选中的选项:{selectedOption}</p></div>);
};const ControlledInputs = () => {return (<div><ControlledCheckbox /><hr /><ControlledRadio /></div>);
};export default ControlledInputs;

在这个示例中,我们分别创建了两个组件,一个是用于处理复选框的ControlledCheckbox组件,另一个是用于处理单选按钮的ControlledRadio组件。它们都使用了useState来管理状态。

下拉列表

下面是一个下拉列表的受控组件示例:

javascript">import React, { useState } from 'react';const ControlledSelect = () => {const [selectedOption, setSelectedOption] = useState('');const handleSelectChange = (event) => {setSelectedOption(event.target.value);};return (<div><h2>下拉列表示例</h2><select value={selectedOption} onChange={handleSelectChange}><option value="">请选择</option><option value="option1">选项1</option><option value="option2">选项2</option><option value="option3">选项3</option></select><p>选择的选项:{selectedOption}</p></div>);
};export default ControlledSelect;

非受控组件

在大多数情况下,react 中使用的都是受控组件。某些情况下,需要传统 dom 进行处理。需要使用非受控组件。

基本示例

非受控组件通常在不需要手动控制组件状态的情况下使用。以下是一个基本的非受控组件示例,展示了如何使用ref来访问DOM元素的值:

javascript">import React, { useRef } from 'react';const UncontrolledComponent = () => {const inputRef = useRef(null);const handleSubmit = (event) => {event.preventDefault();// 使用ref.current.value来获取输入框的值alert('输入的内容是: ' + inputRef.current.value);};return (<div><h2>非受控组件示例</h2><form onSubmit={handleSubmit}><input type="text" ref={inputRef} placeholder="输入内容" /><button type="submit">提交</button></form></div>);
};export default UncontrolledComponent;

在这个示例中,我们使用了useRef来创建一个引用inputRef,它会指向输入框的DOM元素。当表单被提交时,我们可以通过inputRef.current.value来获取输入框的值。这里并没有使用useState来存储输入框的值,因此这是一个非受控组件。

默认值

非受控组件可以在初始化时给定默认值,这可以通过在组件的defaultValue属性上设置值来实现。以下是一个示例:

javascript">import React, { useRef } from 'react';const UncontrolledComponentWithDefault = () => {const inputRef = useRef(null);const handleSubmit = (event) => {event.preventDefault();// 使用ref.current.value来获取输入框的值alert('输入的内容是: ' + inputRef.current.value);};return (<div><h2>非受控组件示例(带默认值)</h2><form onSubmit={handleSubmit}>{/* defaultValue属性用于设置输入框的默认值 而不是 value */}<input type="text" defaultValue="默认值"ref={inputRef} placeholder="输入内容" /><button type="submit">提交</button></form></div>);
};export default UncontrolledComponentWithDefault;

在这个示例中,输入框的默认值被设置为"默认值",用户可以在此基础上进行修改。当用户提交表单时,通过inputRef.current.value可以获取到输入框中的值。

文件上传

javascript">import React, { useRef } from 'react';const UncontrolledFileUpload = () => {const fileInputRef = useRef(null);const handleUpload = () => {// 使用fileInputRef.current.files来获取上传的文件列表const fileList = fileInputRef.current.files;if (fileList.length > 0) {const uploadedFile = fileList[0];alert(`已上传文件:${uploadedFile.name}`);// 在这里可以执行文件上传的操作} else {alert('请选择要上传的文件');}};return (<div><h2>非受控文件上传示例</h2><input type="file" ref={fileInputRef} accept=".jpg, .jpeg, .png, .gif" // 可选的文件类型/><button onClick={handleUpload}>上传文件</button></div>);
};export default UncontrolledFileUpload;

在这个示例中,我们使用了useRef来创建一个引用fileInputRef,它会指向文件上传输入框的DOM元素。当用户选择文件并点击上传按钮时,我们可以通过fileInputRef.current.files来获取用户选择的文件列表。然后我们可以执行文件上传的相关操作,例如显示已上传文件的名称。


http://www.ppmy.cn/server/4580.html

相关文章

Golang context 原理分析

1. 说在前面2. 场景分析 2.1 链式传递2.2 主动取消2.3 任务超时2.4 数据存储 3. 源码解读 3.1 一个核心数据结构 3.1.1 Context 3.2 四种具体实现 3.2.1 emptyCtx3.2.2 cancelCtx3.2.3 timerCtx3.2.4 valueCtx 3.3 六个核心方法 3.3.1 Background() && TODO()3.3.2 Wit…

【零基础学数据结构】双向链表

1.双向链表的概念 1.1头节点 1.2带头双向循环链表 注意&#xff1a; 哨兵位创建后&#xff0c;首尾连接自己 1.3双链表的初始化 // 创建节点 ListNode* ListBuyNode(ListDatatype x) {ListNode* node (ListNode*)malloc(sizeof(ListNode));if (node NULL){perror("…

VPP IKEv2隧道示例

在安装Ubuntu 22.04.04系统的虚拟机上实现。依据fd.io官网的IKEv2文档&#xff1a;https://s3-docs.fd.io/vpp/22.10/usecases/ikev2/2_vpp.html。 将两个VPP实例通过IPSec隧道连接。操作系统环境&#xff1a; userlocalhost:~$ cat /etc/issue Ubuntu 22.04.4 LTS \n \l安装V…

MariaDB 10.5,MySQL乱码问题,设置字符编码UTF8

目录 场景介绍 具体的解决方法 idea设置编码 修改navicate中创建数据库的编码格式 修改MariaDB 10.5&#xff0c;MySQL的my.ini文件 MariaDB 10.5 MySQL找到路径点开&#xff0c;打开my.ini文件 场景介绍 在网页修改&#xff0c;或者提交数据时候&#xff0c;中文将会变…

封装react-antd-table组件参数以及方法如rowSelection、pageNum、pageSize、分页方法等等

一般情况下&#xff0c;我们在页面组件里面都会使用state创建对应的分页参数和分页方法然后传入对应的组件内部&#xff0c;再或者选择行、全选等等&#xff0c;这都会在每一个组件中徒增大量的代码行数&#xff0c;所以简单整理了一下这个只是针对于处理逻辑的组件&#xff1a…

LeetCode刷题记(四):91~120题

91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; A -> "1" B -> "2" ... Z -> "26" 要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反向映射回字母&#xff08;可能有多种…

tomcat类加载机制

Tomcat是一个流行的开源的Java Servlet容器&#xff0c;用于部署和运行Java Web应用程序。在Tomcat中&#xff0c;类加载机制是非常重要的&#xff0c;它决定了应用程序中的类是如何被加载和管理的。 Tomcat的类加载机制遵循了Java的类加载机制&#xff0c;但也有一些特殊的地…

Mac M3 安装Ollama和llama3,本地部署LobeChat和刘皇叔聊三国!

OllamaLobeChat&#xff0c;本地部署聊天助手 Ollama安装下载OllamaOllama常用指令和链接运行OllamaAPI 交互Ollama基于Llama 3角色扮演 LobeChat安装首先安装docker安装LobeChat的docker 镜像和运行 Ollama安装 下载Ollama 网址&#xff1a;https://ollama.com/ 支持macOS、…