前端React篇之React中什么是受控组件和非控组件?

目录

  • React中什么是受控组件和非控组件?
    • 受控组件
    • 非受控组件


React中什么是受控组件和非控组件?

在React中,受控组件和非受控组件是两种表单元素的状态管理方式。

受控组件

受控组件(Controlled Component)是指其值由React组件的state来控制的表单元素。当用户输入时,值被React state所管理,并且通过onChange事件处理函数来更新state。这意味着组件渲染出的状态与其value或checked属性相对应。React通过这种方式消除了组件的局部状态,使整个状态可控。React官方推荐使用受控表单组件。

受控组件的值在React的状态中定义,并通过事件处理程序进行更新。每当表单元素的值发生变化时,React会更新组件的状态,并且在必要时重新渲染组件。这种机制使得我们可以对用户输入进行验证、控制和处理。

更新state的流程:

  • 可以通过初始state设置表单的默认值
  • 每当表单的值发生变化时,调用onChange事件处理器
  • 事件处理器通过事件对象e获取改变后的状态,并更新组件的state
  • 一旦通过setState方法更新state,就会触发视图的重新渲染,完成表单组件的更新

缺陷:
如果有多个输入框或多个这种组件时,必须为每个编写事件处理函数,让代码看起来臃肿。为了解决这种情况,出现了非受控组件。

在实际工作项目中,我们通常需要对用户的输入进行验证和处理。例如,表单中包含一个文本输入框,我们需要在用户输入后对其进行验证,并在验证通过后执行相应的逻辑操作。

假设我们有一个登录表单,其中包含用户名和密码输入框。我们希望对用户输入进行验证,并在验证通过后执行登录逻辑。

import React, { useState } from 'react'const LoginForm = () => {const [username, setUsername] = useState('')const [password, setPassword] = useState('')const handleUsernameChange = event => {setUsername(event.target.value)}const handlePasswordChange = event => {setPassword(event.target.value)}const handleSubmit = event => {event.preventDefault()// 进行用户名和密码的验证和处理逻辑if (username === 'admin' && password === 'password') {console.log('登录成功')} else {console.log('用户名或密码错误')}}return (<form onSubmit={handleSubmit}><input type="text" value={username} onChange={handleUsernameChange} placeholder="Username" /><input type="password" value={password} onChange={handlePasswordChange} placeholder="Password" /><button type="submit">Login</button></form>)
}

在上述代码中,我们使用useState来定义了username和password两个状态变量,并提供了对应的set方法。输入框的值分别通过value属性绑定到对应的状态变量上,并通过onChange事件处理程序来更新状态变量的值。

  • 受控组件需要定义状态变量和对应的事件处理程序来处理和更新表单元素的值。
  • 每当表单元素的值发生变化时,React会自动更新组件的状态并重新渲染组件。
  • 通过直接修改状态变量的值来更新表单元素的值是不可行的,必须使用对应的事件处理程序进行更新。

在React中,受控组件通过组件的状态变量来控制和更新表单元素的值。通过绑定状态变量和事件处理程序,以及使用value属性来与状态变量进行双向绑定,React能够完全控制表单元素的状态和行为。受控组件适用于需要对用户输入进行验证、控制和处理的场景。

非受控组件

在React中,非控组件(Uncontrolled Component)是指不受React控制的表单元素,其值由DOM元素自身维护和管理。

非控组件中,表单元素的值由DOM元素直接管理,React对其值没有任何控制权。我们通过使用ref来获取DOM元素的值,而不是通过状态(state)来管理和更新。

React官方解释:
要编写一个非受控组件,而不是为每个状态更新都编写数据处理函数,你可以使用ref来从DOM节点中获取表单数据。因为非受控组件将真实数据储存在DOM节点中,所以在使用非受控组件时,有时候更容易同时集成React和非React代码。如果你不介意代码美观性,并且希望快速编写代码,使用非受控组件往往可以减少代码量。否则,你应该使用受控组件。

在实际工作项目中,我们通常需要处理一些不需要对表单元素的值进行实时操作或验证的情况。例如,只是在表单提交时获取表单的最终值用于处理或发送给后端。

假设我们有一个搜索表单,用户输入关键字后点击搜索按钮进行搜索操作。我们只需要在点击按钮时获取输入框的值,并进行相应的搜索逻辑。

import React, { useRef } from 'react'const SearchForm = () => {const inputRef = useRef()const handleSubmit = event => {event.preventDefault()const keyword = inputRef.current.value// 执行搜索逻辑console.log('搜索关键字:', keyword)}return (<form onSubmit={handleSubmit}><input type="text" ref={inputRef} placeholder="请输入关键字" /><button type="submit">搜索</button></form>)
}

在上述代码中,我们使用了React的useRef钩子函数来创建一个inputRef引用。该引用与input元素建立了关联。当表单提交时,我们通过inputRef.current.value来获取input元素的值,并执行相应的搜索逻辑。

  • 非控组件中,我们使用ref来获取表单元素的值,而不是依赖组件的状态。
  • 非控组件的值由DOM元素自身管理,React无法控制它的更新。因此,在非控组件中无法对表单值进行验证或对输入进行实时控制。
  • 非控组件适用于不需要实时处理或验证表单值的场景,例如只需要在提交表单时获取最终的值并进行处理。

在React中,非控组件(Uncontrolled Component)是指由DOM元素自身管理和维护其值的表单元素。与受控组件不同,React不控制非控组件的值,也不存储或更新它们。相反,我们可以使用引用(ref)来获取表单元素的值,然后在需要的时候进行处理。

非控组件的值由DOM元素自身维护,React并不直接控制它们。我们可以通过创建一个引用(ref)并将其绑定到DOM元素上,然后通过引用来获取和处理元素的值。这种方式脱离了React的状态管理,更加直接地操作DOM元素。

在实际工作项目中,非控组件适用于那些不需要对表单元素值进行直接处理的场景。例如,当我们只需要在提交表单时获取表单元素的值,而不需要对其进行验证或处理时,可以使用非控组件。

假设我们有一个简单的表单,包含一个输入框和一个提交按钮。我们只需要在点击提交按钮时获取输入框的值,而不需要对输入值进行验证或处理。

import React, { useRef } from 'react'const MyForm = () => {const inputRef = useRef(null)const handleSubmit = event => {event.preventDefault()const value = inputRef.current.valueconsole.log('输入值:', value)}return (<form onSubmit={handleSubmit}><input type="text" ref={inputRef} /><button type="submit">提交</button></form>)
}

在上述代码中,我们使用了useRef来创建一个引用(ref),并将其绑定到输入框的ref属性上。在表单提交时,通过读取inputRef.current.value来获取输入框的值,并在控制台打印出来。

  • 非控组件通过直接操作DOM元素来管理和获取表单元素的值,不依赖React的状态管理。
  • 在使用非控组件时,我们需要使用ref来获取在React中,非控组件(Uncontrolled Component)是指由DOM直接管理和控制其值的表单元素。React不会跟踪和管理这些表单元素的值,而是通过访问DOM来获取和处理它们的值。

非控组件的值由DOM元素自身维护,而不是由React的状态管理。我们可以使用ref来获取表单元素的引用,并直接访问和处理表单元素的值。

在实际工作项目中,非控组件适用于不需要对表单元素的值进行直接处理的情况。例如,只需要在某个事件中获取表单的最终值,然后进行提交或处理。

假设我们有一个表单,其中包含一个输入框,我们需要获取用户输入的值并进行一些处理。

import React, { useRef } from 'react'const MyForm = () => {const inputRef = useRef(null)const handleSubmit = event => {event.preventDefault()const value = inputRef.current.value// 根据需求处理输入值console.log('输入值:', value)}return (<form onSubmit={handleSubmit}><input type="text" ref={inputRef} /><button type="submit">提交</button></form>)
}export default MyForm

在上述代码中,我们使用useRef来创建一个引用(ref),并将其绑定到输入框元素上。当表单提交时,我们可以通过引用访问输入框的值,并在事件处理程序中进行处理。

  • 非控组件不受React的状态管理,不会自动更新组件的状态或进行重渲染。
  • 非控组件更接近于传统的DOM操作,可以直接访问元素的值。
  • 在使用非控组件时,要确保正确处理表单元素值的逻辑,并确保通过其他方式(如ref)来获取表单元素的引用。
  • 尽量在必要时使用非控组件,因为受控组件提供了更直观和可预测的状态管理方式

总结:
页面中所有输入类的DOM如果是现用现取的称为非受控组件,而通过setState将输入的值维护到了state中,需要时再从state中取出,这里的数据就受到了state的控制,称为受控组件。

在React中,受控组件和非受控组件是表单元素的两种状态管理方式。选择何种方式通常取决于具体情况和个人偏好。

持续学习总结记录中,回顾一下上面的内容:
在React中,受控组件和非控组件是用于处理表单元素的两种不同的方式。
受控组件(Controlled Component)是指通过React的状态(state)来控制表单元素的值和状态。我们将表单元素的值存储在组件的状态中,并通过事件处理程序来更新状态。这种方式使得React具有对表单值的完全控制权,可以实时验证、处理和响应表单的变化。
非控组件(Uncontrolled Component)是指表单元素的值由DOM元素自身管理,React对其值没有控制权。我们通过使用ref来获取DOM元素的值,而不是依赖React的状态管理。非控组件更接近于传统的DOM操作,对表单值的控制权交给了DOM元素本身。
受控组件通过React的状态管理表单元素的值和状态,具有实时验证、处理和响应变化的能力。非控组件中,表单元素的值由DOM元素自身管理,React无法控制它们的更新。使用ref来获取和处理表单元素的值。根据具体需求选择适合的方式,受控组件提供了更高程度的控制和可预测性,而非控组件更直接地操作DOM元素。

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

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

相关文章

探秘Solr:解密搜索引擎背后的原理与应用(一)

本系列文章简介&#xff1a; 在本系列文章中&#xff0c;我们将从Solr的基本概念开始&#xff0c;解释索引和搜索是如何工作的&#xff0c;深入探讨倒排索引、分词器和搜索算法等关键概念。接着&#xff0c;我们将了解Solr的工作原理&#xff0c;从数据导入和索引构建到搜索流程…

数据结构 - 栈和队列

本篇博客将介绍栈和队列的定义以及实现。 1.栈的定义 栈是一种特殊的线性表&#xff0c;只允许在固定的一端进行插入和删除数据&#xff0c;插入数据的一端叫做栈顶&#xff0c;另一端叫做栈底。栈中的数据遵守后进先出的原则 LIFO (Last In First Out)。 插入数据的操作称为压…

如何借助私域营销在医美行业中脱颖而出?

在现今这个以貌取人的社会&#xff0c;外貌焦虑已变得司空见惯。美丽往往能给人带来更多的瞩目和机遇&#xff0c;但天生丽质并非人人可得。随着经济的繁荣和消费结构的升级&#xff0c;颜值经济开始崭露头角&#xff0c;医美行业因此受到了广大消费者的青睐&#xff0c;迎来了…

Leetcode 剑指 Offer II 068.搜索插入位置

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个排序的整数数组 nums 和一个整数目标值 target &#xf…

阿波罗登月需要解决飞行控制问题,数学家卡尔曼在维纳控制的基础上提出了卡尔曼滤波

说到登月&#xff0c;很多人只想到和火箭以及航天器相关的技术&#xff0c;其实登月离不开信息技术的革命。因为从飞行控制到远程通信&#xff0c;都需要解决很多过去从未遇到过的难题。 登月首先要保证在月球上着陆的地点准确&#xff0c;而且要保证返回火箭和飞船能够在月球轨…

【LeetCode: 211. 添加与搜索单词 - 数据结构设计 + 前缀树】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

npm install没有创建node_modules文件夹

问题记录 live-server 使用时 报错&#xff1a;live-server : 无法将“live-server”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 npm install 安装 但是 这时npm install没有创建node_modules文件夹&#xff0c;只生成package-lock.json文件 方法一&#xff1a; 手…

CEF c++调用JS,并获得JS返回值的 流程

相关章节: CEF JS与c++能够交互的原理 以及 JS 调用C++的流程分析 CEF 之 Render进程 与 Browser进程通信 目录

【笔试48天强训】day05

统计回文1 “回文串”是一个正读和反读都一样的字符串&#xff0c;比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串&#xff0c;生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串…

通过Electron打包前端项目为exe

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;爱蹦跶的大A阿 &#x1f525;当前正在更新专栏&#xff1a;《JavaScript保姆级教程》、《VUE》、《Krpano》 ✨ 正文 1、 拉取electron官网上的demo&#xff0c;拉下来之后安装依赖&#xff0c;项目跑起来之后&#xff0c;就…

第十篇 - 如何利用人工智能技术做好营销流量整形管理?(Traffic Shaping)- 我为什么要翻译介绍美国人工智能科技巨头IAB公司

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市​​​​​​​。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先…

上海计算机学会竞赛平台2024.1月月赛丙组T1 成绩等第题解

题目描述 给定一个在到之间的整数 &#xff0c;请将它转成等第&#xff0c;规则如下&#xff1a; 为 A为 B为 C为 D为 F 输入格式 单个数字表示 输出格式 单个字符表示答案 数据范围 样例数据 输入: 93 输出: A 输入: 44 输出: F

公网IP与私有IP及远程互联

1.公网有私有IP及NAT 公网IP是全球唯一的IP&#xff0c;通过公网IP&#xff0c;接入互联网的设备是可以访问你的设备。但是IPV4资源有限&#xff0c;一般ISP(Internet Service Provider)并不会为用户提供公网IP。所以家里的计算机在公司是没法直接使用windows远程桌面直接访问…

Arrays类常用方法详解(源码分析)

Arrays.equals&#xff08;&#xff09; 众所周知&#xff0c;equals方法是比较里面的内容是否相等的方法&#xff0c;那Arrays中的equals&#xff08;&#xff09;方法&#xff0c;就是重写了Object中equals&#xff08;&#xff09;&#xff0c;用来比较数组中的内容是否相等…

Find My产品越来越得到市场认可,伦茨科技ST17H6x芯片赋能厂家

苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch&#xff0c;如今的Find My已经不单单可以查找苹果的设备&#xff0c;随着第三方设备的加入&#xff0c;将丰富Find My Network的版图。产…

LCR 164. 破解闯关密码

解题思路&#xff1a; 贪心 class Solution {public String crackPassword(int[] password) {String[] strs new String[password.length];for(int i 0; i < password.length; i)strs[i] String.valueOf(password[i]);Arrays.sort(strs, (x, y) -> (x y).compareTo(…

考研复习c语言初阶(1)

本人准备考研&#xff0c;现在开始每天更新408的内容&#xff0c;目标这个月结束C语言和数据结构&#xff0c;每天更新~ 一.再次认识c语言 C语言是一门通用计算机编程语言&#xff0c;广泛应用于底层开发。C语言的设计目标是提供一种能以简易 的方式编译、处理低级存储器、产生…

面试题:单例模式输出静态变量

面试题 一、写出两种情况下的运行结果。第一种如下面的代码所示&#xff1b;第二种是把“1”所在行注释掉&#xff0c;把“2”行的注释去掉。 class Singleton {private static Singleton singleton new Singleton(); //1static int i;static int j 0;//private static Sing…

学习Java的第五天

目录 Java中有三种主要的循环结构&#xff1a; while 循环 实例 do…while 循环 实例 for循环 实例 三种循环之间的区别 增强 for 循环 实例 break 关键字 语法 实例 continue 关键字 语法 实例 Java 循环结构 while &#xff0c;do…while 及 for 顺序结构的…

WordPress建站入门教程:如何选择和设置固定链接结构?

我们成功搭建好WordPress网站后&#xff0c;发布的文章对应的URL地址默认是使用“日期和名称型”&#xff0c;即是网站域名跟着的是年月日&#xff0c;最后是文章标题&#xff0c;如http://www.yigujin.com/2024/03/06/免费响应式WordPress博客主题JianYue/ 为了让我们的文章U…