【React】表单

受控组件

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

一个基本的受控组件

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

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;

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

限制了用户输入的内容:

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;

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

文本域

import React, { useState } from 'react';

const ControlledTextarea = () => {
  const [textareaValue, setTextareaValue] = useState('');

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

  return (
    <div>
      <h2>受控文本域示例</h2>
      <textarea
        value={textareaValue}
        onChange={handleChange}
        placeholder="输入内容"
        rows={5} // 设置文本域的行数
        cols={50} // 设置文本域的列数
      />
      <p>输入的内容:{textareaValue}</p>
    </div>
  );
};

export default ControlledTextarea;

单选与多选框

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

import React, { useState } from 'react';

const ControlledCheckbox = () => {
  const [isChecked, setIsChecked] = useState(false);

  const handleCheckboxChange = () => {
    setIsChecked(!isChecked);
  };

  return (
    <div>
      <h2>单选框示例</h2>
      <label>
        <input
          type="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>
        <input
          type="radio"
          value="option1"
          checked={selectedOption === 'option1'}
          onChange={handleOptionChange}
        />
        选项1
      </label>
      <label>
        <input
          type="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来管理状态。

下拉列表

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

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元素的值:

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属性上设置值来实现。以下是一个示例:

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可以获取到输入框中的值。

文件上传

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.mfbz.cn/a/559979.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

logistic分叉图

MATLAB代码 % 初始化 r_min 2.5; % 参数r的起始值 r_max 4.0; % 参数r的结束值 r_step 0.001; % 参数r的步长 r_values r_min:r_step:r_max; % 参数r的范围% 分岔图数据初始化 num_iterations 1000; % 总迭代次数 num_last_points 100; % 用于绘图的最后的这些…

idea2024.1发布,lambda多语句的内联断点,增强spring图标等新特性,你没玩过的全新版本

这里是weihubeats,觉得文章不错可以关注公众号小奏技术 简述 2024-04-04 idea官方宣布发布了 一些重大更新 随后我便下载了你没玩过的全新版本IntelliJ IDEA Ultimeate版本试玩 然后脑子里面想到这个 开玩笑 实际下载完是这样 更新内容 更新的内容比较多 关键亮点主要有如下…

VUE 使用 Vite 创建一个 vue3.0 + vite 项目

Vite 是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验。它主要由两部分组成&#xff1a; 1. 一个开发服务器&#xff0c;它基于 原生 ES 模块 提供了 丰富的内建功能&#xff0c;如速度快到惊人的 模块热更新&#xff08;HMR&#xff09;。 2. 一套构建指令&#…

每日算法练习(1)

开一个新坑&#xff0c;记录下自己每天的算法练习&#xff0c;希望自己通过1个多月的学习&#xff0c;能够成为算法大神。 下面正式开始新坑。 两个数组的交集 这是牛客上的题&#xff0c;根据题意&#xff0c;我们有多种解法&#xff0c;这题用哈希比较好写。我们可以弄一个…

智慧公厕解决方案易集成好使用的智能硬件

在现代城市建设中&#xff0c;智慧公厕的需求日益增长。为了提供更好的用户体验和更高效的管理&#xff0c;易集成、好使用的智能硬件成为智慧公厕解决方案的关键组成部分。 1. 蹲位有人无人感应器&#xff1a;是用于检测厕位有人无人的设备&#xff0c;根据现场不同的安装条件…

【管理咨询宝藏78】MBB大型城投集团核心能力建设分析报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏78】MBB大型城投集团核心能力建设分析报告 【格式】PDF版本 【关键词】战略规划、商业分析、管理咨询、MBB顶级咨询公司 【强烈推荐】 这是一套…

Java中的栈和队列

1.前言 在计算机科学中&#xff0c;数据结构是用来组织和存储数据的方式&#xff0c;以便可以高效地访问和修改。栈和队列是两种最基本的数据结构&#xff0c;它们在各种计算过程中都有广泛的应用。本文将介绍栈和队列的概念、特性以及它们的一些常见应用。 2.栈 2.1概念 栈…

Vue实现多角色登录,Vue-Router路由守卫控制权限页面

实现页面侧边栏和头部不变&#xff0c;当点击某个功能时&#xff0c;只有主体部分发生变化&#xff0c;这要用到子路由技术 我的项目结构如上&#xff0c;其中包含侧边栏和头部的文件是Manage.vue&#xff0c;主页面是Home.vue&#xff0c;个人页面是Person.vue&#xff0c;用户…

kaggle咖啡销售分析案例侧重可视化折线图条形图扇形图柱状图

目录 概述 环境依赖 数据描述 代码概述 导包 数据读取 统计缺失值 数据结构概述 描述统计 时间轴数据转换 月交易统计直方图 周交易统计图 小时数据转换 小时折线图 销售关系可视化统计 销售占比扇形图 价格箱线图 各类别多维度条形图统计 商店位置交易量折线…

9个技巧使你的Python代码更Pythonic!

如何区分漂亮和丑陋的代码&#xff1f; 更重要的是&#xff0c;如何写出漂亮的 Python 代码&#xff1f; 本文将通过初学者容易理解的例子展示9个神话般的Python技巧&#xff0c;以帮助你在日常工作中编写更多的Pythonic程序。 01 product() 使用 product() 函数避免嵌套的…

电缆故障测试仪的操作方法有哪些?

电缆故障测试仪是一种专业设备&#xff0c;用于检测电力电缆和通信电缆的各种故障。它采用多种技术手段&#xff0c;包括但不限于低压脉冲法、高压闪络法、直闪法和冲闪法。这些方法适用于不同类型的电缆故障&#xff0c;例如断线、接触不良、低阻接地、高阻接地、开路故障和短…

iOS开发 刻度盘 仪表盘,圆点按钮滑动控制,渐变色

最近项目需要&#xff0c;想做一个渐变色的刻度盘&#xff0c;圆形按钮滑动控制&#xff0c;所以 用oc写了一下&#xff0c;代码没附上&#xff0c;想看代码可以私信联系&#xff0c;效果如下图。 部分代码 self.drawCenter CGPointMake(self.frame.size.width / 2.0, self.f…

ubuntu22.04搭建dns内网

近期&#xff0c;需要在无网络的ubuntu环境下搭建内部可用的dns内网&#xff0c;总共花费3个工作日晚上&#xff0c;总算成功搭建&#xff0c;做个记录&#xff0c;记录踩坑记录&#xff0c;同时方便以后翻阅。 安装软件包&#xff1a; 有网络环境下&#xff0c;比较简单&…

科研基础与工具(论文搜索)

免责申明&#xff1a; 本文内容只是学习笔记&#xff0c;不代表个人观点&#xff0c;希望各位看官自行甄别 参考文献 科研基础与工具&#xff08;YouTube&#xff09; 搜索论文 Google Scholar 谷歌学术 涵盖面太全了&#xff0c;都收录&#xff0c;就会有很多低质量的论文…

基于STM32F103RCT6最小系统原理图和PCB

目录 1、原理图 2、PCB 3、3D图 资料下载地址&#xff1a;基于STM32F103RCT6最小系统原理图和PCB 1、原理图 2、PCB 3、3D图

解决Error in writing header file of the driver

在源代码里面更新了一批常规的内容&#xff0c;编译的时候遇到一个error&#xff0c;一大片都是红的。XXX是项目名称。 Description Resource Path Location Type Generator: ERROR: Error in writing header file of the driver XXX Cpu Processor Expert Problem 表面意思是…

nvm下载的node没有npm

nvm下载的node没有npm 相信大家最近可能发现自己使用的nvm下载nodejs没有npm了。 会出现这种情况&#xff1a; C:\Users\89121>nvm install 15 Downloading node.js version 15.14.0 (64-bit)... Complete Downloading npm version 7.7.6... Download failed. Rolling Bac…

门禁管理系统服务器如何内网映射让外网访问?

禁管理系统整体解决方案,可实现请假出入联动、门状态监控、电子地图、非法闯入报警、远程开门、红外防夹、智能统计等功能&#xff0c;应用非常广泛。 如果门禁管理系统部署在没有公网IP的本地服务器上&#xff0c;如何设置&#xff0c;能让外网互联网上也能登录访问内部的管理…

04 JavaScript学习:输出

JavaScript 没有任何打印或者输出的函数。 JavaScript 显示数据 JavaScript 可以通过不同的方式来输出数据&#xff1a; 使用 window.alert() 弹出警告框。使用 document.write() 方法将内容写到 HTML 文档中。使用 innerHTML 写入到 HTML 元素。使用 console.log() 写入到浏…

怎样在外网登录访问CRM管理系统?

一、什么是CRM管理系统&#xff1f; Customer Relationship Management&#xff0c;简称CRM&#xff0c;指客户关系管理&#xff0c;是企业利用信息互联网技术&#xff0c;协调企业、顾客和服务上的交互&#xff0c;提升管理服务。为了企业信息安全以及使用方便&#xff0c;企业…