React 中非受控和受控的组件

  • React 中非受控和受控的组件
    • 受控的组件
    • 非受控的组件
    • 小结

React 中非受控和受控的组件

两者都是呈现 HTML 表单元素的 React 组件。这意味着,每当您创建具有 HTML 表单的组件时,您都会创建两个组件中的任何一个。但是两者之间的显着差异,接下来我们来我们来详细介绍它们。

受控的组件

在 HTML 中,表单元素(如<input><textarea><select>)通常自己维护 state,并根据用户输入进行更新。而在 React 中,可变状态(mutable state)通常保存在组件的 state 属性中,并且只能通过使用 setState()来更新。

我们可以把两者结合起来,使 React 的 state 成为“唯一数据源”。渲染表单的 React 组件还控制着用户输入过程中表单发生的操作。被 React 以这种方式控制取值的表单输入元素就叫做“受控组件”。

让我们看以下示例以更好地理解此概念。

import { useState } from "react";const TextInputControlled = () => {const [name, setName] = useState("");return (<div><inputtype="text"placeholder="Type... (Controlled)"value={name}onChange={(event) => {console.log(event.target.value);setName(event.target.value);}}/></div>);
};

在上面的函数组件中,我们调用了状态,并且可以在方法的帮助下对其进行更改。该组件将返回带有事件的输入字段,该事件正在记录输入字段值,并使用该方法将名称设置为新的输入值。

对于受控组件来说,输入的值始终由 React 的 state 驱动。你也可以将 value 传递给其他 UI 元素,或者通过其他事件处理函数重置,但这意味着你需要编写更多的代码。

然而当有多个输入框,或者多个这种组件时,如果想同时获取到全部的值就必须每个都要编写事件处理函数,这会让代码看着很臃肿,所以为了解决这种情况,出现了非受控组件。

这个时候我们更推荐使用非受控组件。

非受控的组件

不受控制的组件是呈现表单元素并在 DOM 本身中更新其值的组件。可以使用 ref 而不是为每个状态更新编写事件处理程序,以便从 DOM 访问表单值。集成具有不受控制组件的 React 和非 React 代码更容易,因为不受控制的组件在 DOM 中维护其事实来源。如果您希望代码数量快速而粗糙,则代码数量也会略有减少。

默认值

在 React 的渲染生命周期中,DOM 中的值将被表单元素上的 value 属性覆盖。通过使用不受控制的组件,您可能希望 React 设置初始值,但保持后续更新不变。在这种情况下, 你可以指定一个 defaultValue 属性,而不是 value。在一个组件已经挂载之后去更新 defaultValue 属性的值,不会造成 DOM 上值的任何更新。

让我们看下面的例子,

import { useRef } from "react";const App = () => {const inputRef = useRef(null);const handleSubmit = () => {console.log(inputRef.current.value);};return (<div><input type="text" defaultValue="Type..." ref={inputRef} /><button onClick={handleSubmit}>Submit</button></div>);
};export default App;

在上面的示例中,我们使用了一个调用,并将其附加到使用属性的元素。单击提交按钮时,其值将记录在控制台中。

同样,<input type="checkbox"><input type="radio"> 支持 defaultChecked<select><textarea> 支持 defaultValue

文件输入标记

<input type="file" ref={this.fileInput} />

元素始终是不受控制的组件,因为它的值不能以编程方式设置,而只能由用户设置。<input type="file" />

不受控制组件的限制

  • 无即时字段验证
  • 无法有条件地禁用提交按钮
  • 无法强制执行输入格式
  • 单个数据没有多个输入
  • 无动态输入

小结

总体而言,非受控组件可以在必要时使用或比受控组件更有效,否则,尽可能使用受控组件。若要使用非受控制的组件,可以使用 ref 直接访问 DOM 值。对于受控组件,我们将表单数据值存储在 React 组件的状态属性中。在了解了“非受控制”和“受控”组件之后,很明显,“受控”组件绝对推荐使用“而不是”非受控制“组件,但”非受控制“组件有时也是必不可少的,因此,了解两者是件好事。

React 中非受控和受控的组件相关推荐

  1. [react] react中什么是受控组件?

    [react] react中什么是受控组件? 表单元素的value/checked值与state绑定,同时表单元素的onChange可以动态的改变对应的state的值,即数据的变更可以更新视图,用户操 ...

  2. React受控非受控组件详解,PureComponent介绍,Refs, children属性详解

    文章目录 React 受控非受控组件 PureComponent 受控组件&非受控组件 受控组件 非受控组件 受控组件和非受控组件区别 PureComponent PureComponent ...

  3. React form表单受控组件和非受控组件

    1.受控组件 每当表单的状态发生变化时,都会被写入到组件中的state中. 受控组件的更新流程如下: 可以通过在初始state中设置表单的默认值: 每当表单发生变化时,调用onChange事件处理器: ...

  4. web前端高级React - React从入门到进阶之组件的状态提升

    系列文章目录 第一章:React从入门到进阶之初识React 第一章:React从入门到进阶之JSX简介 第三章:React从入门到进阶之元素渲染 第四章:React从入门到进阶之JSX虚拟DOM渲染 ...

  5. web前端高级React - React从入门到进阶之组件的懒加载及上下文Context

    第二部分:React进阶 系列文章目录 第一章:React从入门到进阶之初识React 第一章:React从入门到进阶之JSX简介 第三章:React从入门到进阶之元素渲染 第四章:React从入门到 ...

  6. React 中动态的加载组件 ---loadable-components

    loadable-components 用于在react 中动态的加载组件 安装方法: npm i loadable-components 使用: 引入: 代码中使用: 希望对你有所帮助

  7. React学习:ref调用、组件封装调用-学习笔记

    文章目录 React学习:ref调用.组件封装调用-学习笔记 ref调用-string形式 ref调用-回调形式(官方推荐) ref调用-父调子 组件封装调用demo(全选) demo1(单组件) d ...

  8. React(二):类组件、函数式组件

    Component(组件)可以是类组件(class component).函数式组件(function component). 1.类组件: 通常情况下,我们会使用ES6的class关键字来创建Rea ...

  9. React文档(五)组件和props

    组件可以让你将UI分割成独立的,可复用的模块,然后考虑将每个模块彼此隔离. 从概念上理解,组件就像js中的函数.他们接受随意的输入(被称为props)然后返回React元素来描述屏幕上应该出现什么. ...

最新文章

  1. gtk linux 升级_需要在Ubuntu上更新GTK(10.04)
  2. PowershellTFS_Part 1
  3. BAT 招聘岗位 100%都考的知识,你精通了吗?
  4. boost::math::non_central_chi_squared用法的测试程序
  5. Gartner:2020年企业中无“云”战略将极为罕见
  6. 模块化加载时断点调试没反应,进入不了断点
  7. 高校再陷版权纷争:MATLAB遭禁用后,又一基础软件严查盗版
  8. 创建oracle数据库
  9. FCKeditor集锦
  10. python个人所得税怎么写_Python实现的个人所得税计算器示例
  11. thinkphp内核开源商城APP小程序H5开源源码讲解
  12. python mysql跨库查询_Python查询mysql库
  13. gpt和mbr的区别
  14. Java 对上传文件后缀格式的校验
  15. 【洛谷P1069 细胞分裂】
  16. 数据结构-树-愿天下有情人都是失散多年的兄妹
  17. html为知笔记模板,为知笔记使用技巧:如何建立模板
  18. 微信小程序连接emqx服务器实现数据交互
  19. 克里斯·麦克切斯尼《高效能人士的执行4原则》读书笔记
  20. CC2530内部结构图

热门文章

  1. 【WPS表格】表格左右列/上下行内容互换位置
  2. JS高级程序设计(6)
  3. Windows和ubuntu使用python脚本自动登录校园网
  4. oracle 序列递增更新,ORACLE自动递增--序列
  5. talend同步mysql_Talend可以为MySQL输出使用动态表名吗?
  6. trex抓包过程详解
  7. 实验九 单周期MIPS CPU设计实验(基于Logisim)
  8. Dependency Injection2
  9. vscode主题颜色 - 设置篇
  10. LP3THW 练习、学习训练、个人小结 Exercise_3