React中的受控组件和非受控组件

一、认识受控组件

在React中,HTML表单的处理方式和普通的DOM元素不太一样:表单元素通常会保存在一些内部的state。

比如下面的HTML表单元素:

  • 这个处理方式是DOM默认处理HTML表单的行为,在用户点击提交时会提交到某个服务器中,并且刷新页面;
  • 在React中,并没有禁止这个行为,它依然是有效的;
  • 但是通常情况下会使用JavaScript函数来方便的处理表单提交,同时还可以访问用户填写的表单数据;
  • 实现这种效果的标准方式是使用“受控组件”;

在这里插入图片描述

二、受控组件练习

HTML 中,表单元素(如<input>、 <textarea> 和 <select>)之类的表单元素通常自己维护 state,并根据用户输入进行更新。

而在 React 中,可变状态(mutable state)通常保存在组件的 state 属性中,并且只能通过使用 setState()来更新。

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

由于在表单元素上设置了 value 属性,因此显示的值将始终为this.state.value,这使得 React 的 state 成为唯一数据源。

由于 handleUsernameChange 在每次按键时都会执行并更新 React 的 state,因此显示的值将随着用户输入而更新。

在这里插入图片描述

三、受控组件的其他练习

  1. textarea标签
  • texteare标签和input比较相似:
  1. select标签
  • select标签的使用也非常简单,只是它不需要通过selected属性来控制哪一个被选中,它可以匹配state的value来选中。
    在这里插入图片描述
    在这里插入图片描述
  1. 处理多个输入
  • 多处理方式可以像单处理方式那样进行操作,但是需要多个监听方法:
    在这里插入图片描述
import React, { PureComponent } from "react";
import PropTypes from "prop-types";class App extends PureComponent {constructor(props) {super(props);this.state = {username: "",password: "",validCode: "",};}render() {return (<div><form onSubmit={(e) => this.handleSubmit(e)}><div><label htmlFor="username">用户:{/* 受控组件 */}<inputtype="text"id="username"onChange={(e) => this.handleUsernameChange(e)}value={this.state.username}/></label></div><div><label htmlFor="password">密码:{/* 受控组件 */}<inputtype="text"id="password"onChange={(e) => this.handlePasswordChange(e)}value={this.state.password}/></label></div><div><label htmlFor="validCode">验证码:{/* 受控组件 */}<inputtype="text"id="validCode"onChange={(e) => this.handleValidCodeChange(e)}value={this.state.validCode}/></label></div><input type="submit" value="提交" /></form></div>);}handleSubmit(e) {e.preventDefault();const { username, password, validCode } = this.state;console.log(username, password, validCode);}handleUsernameChange(e) {console.log(e.target.value);this.setState({username: e.target.value,});}handlePasswordChange(e) {console.log(e.target.value);this.setState({password: e.target.value,});}handleValidCodeChange(e) {console.log(e.target.value);this.setState({validCode: e.target.value,});}
}App.propTypes = {};export default App;
  • 这里我们可以使用ES6的一个语法:计算属性名(Computed property names)
    在这里插入图片描述
import React, { PureComponent } from "react";
import PropTypes from "prop-types";class App extends PureComponent {constructor(props) {super(props);this.state = {username: "",password: "",validCode: "",};}render() {return (<div><form onSubmit={(e) => this.handleSubmit(e)}><div><label htmlFor="username">用户:{/* 受控组件 */}<inputtype="text"name="username"id="username"onChange={(e) => this.handleChange(e)}value={this.state.username}/></label></div><div><label htmlFor="password">密码:{/* 受控组件 */}<inputtype="text"name="password"id="password"onChange={(e) => this.handleChange(e)}value={this.state.password}/></label></div><div><label htmlFor="validCode">验证码:{/* 受控组件 */}<inputtype="text"name="validCode"id="validCode"onChange={(e) => this.handleChange(e)}value={this.state.validCode}/></label></div><input type="submit" value="提交" /></form></div>);}handleSubmit(e) {e.preventDefault();const { username, password, validCode } = this.state;console.log(username, password, validCode);}handleChange(e) {console.log(e.target.name);this.setState({[e.target.name]: e.target.value})}/* handleUsernameChange(e) {console.log(e.target.value);this.setState({username: e.target.value,});}handlePasswordChange(e) {console.log(e.target.value);this.setState({password: e.target.value,});}handleValidCodeChange(e) {console.log(e.target.value);this.setState({validCode: e.target.value,});} */
}App.propTypes = {};export default App;

在这里插入图片描述

四、非受控组件

React推荐大多数情况下使用 受控组件 来处理表单数据:

  • 一个受控组件中,表单数据是由 React 组件来管理的;
  • 另一种替代方案是使用非受控组件,这时表单数据将交由 DOM 节点来处理;

如果要使用非受控组件中的数据,那么我们需要使用 ref 来从DOM节点中获取表单数据。
我们来进行一个简单的演练:

  • 使用ref来获取input元素;
    在这里插入图片描述

在这里插入图片描述

在非受控组件中通常使用defaultValue来设置默认值;

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

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

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

相关文章

JS动画 | 用TweenMax实现收集水滴效果

之前在CodePen上接触了TweenMax, 被它能做到的酷炫效果震撼了. (文末放了5个GSAP的效果GIF) 最近要做一个"收集水滴"的动效, 于是就试用了一下TweenMax实现这个效果. 什么是TweenMax TweenMax是GSAP(GreenSock Animation Platform)创作的动画工具库. GSAP的产品除了T…

React中的组件通信——父传子、子传父、Context

0、认识组件间的通信 在开发过程中&#xff0c;我们会经常遇到需要组件之间相互进行通信&#xff1a; 比如App可能使用了多个Header&#xff0c;每个地方的Header展示的内容不同&#xff0c;那么我们就需要使用者传递给Header一些数据&#xff0c;让其进行展示&#xff1b;又比…

React ref的转发

在前面学习ref时讲过&#xff0c;ref不能应用于函数式组件&#xff1a; 因为函数式组件没有实例&#xff0c;所以不能获取到对应的组件对象 但是&#xff0c;在开发中我们可能想要获取函数式组件中某个元素的DOM&#xff0c;这个时候我们应该如何操作呢&#xff1f; 方式一&…

电脑桌面 IE 图标删除不了的解决方法

电脑换了系统之后想把桌面的IE浏览器给删掉&#xff0c;可是直接删除又删不掉&#xff0c;杀毒软件查杀也没有问题。找了很多方法&#xff0c;终于才把它给解决了。下面&#xff0c;就把我的方法分享给桌面ie图标删除不了的解决方法&#xff0c;希望能对大家有所帮助! 方法 1 1…

React Portals的使用

某些情况下&#xff0c;我们希望渲染的内容独立于父组件&#xff0c;甚至是独立于当前挂载到的DOM元素中&#xff08;默认都是挂载到id为root的DOM元 素上的&#xff09;。 Portal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案&#xff1a; 第一个参数&a…

绿盟防火墙配置手册_双链路环境下不同品牌防火墙更换案例分享

关注“IT实战基地”&#xff0c;与行业大咖交流学习&#xff01;引言不同品牌防火墙在整体更换时&#xff0c;实施迁移时除了将防火墙的接口IP地址&#xff0c;路由&#xff0c;安全策略进行迁移时&#xff0c;在实际更换时还可能遇到一切奇怪的问题&#xff0c;尤其是在双链路…

React中的fragment和StrictMode

一、fragment 在之前的开发中&#xff0c;我们总是在一个组件中返回内容时包裹一个div元素&#xff1a; 我们又希望可以不渲染这样一个div应该如何操作呢&#xff1f; 使用FragmentFragment 允许你将子列表分组&#xff0c;而无需向 DOM 添加额外节点&#xff1b; React还…

怎么让车辆gps定位失效_如何更有效地检测车辆gps定位器?

GPS定位器可以帮助我们管理我们心爱的汽车&#xff0c;在任何时候定位和查询车辆的位置&#xff0c;并跟踪车辆防盗&#xff0c;一些汽车公司和公共交通企业也可以管理和调度车队&#xff0c;管理数据&#xff0c;并根据GPS定位器分析数据&#xff0c;实现智能和现代交通。GPS定…

React中的CSS——styled-components

一、认识CSS in JS 实际上&#xff0c;官方文档也有提到过CSS in JS这种方案&#xff1a; https://zh-hans.reactjs.org/docs/faq-styling.html “CSS-in-JS” 是指一种模式&#xff0c;其中 CSS 由 JavaScript 生成而不是在外部文件中定义&#xff1b;注意此功能并不是 Reac…

l380废墨收集垫已到使用寿命_湖北雨水收集系统定制

淮北海聚环保设备有限公司为您详细解读jrWVof湖北雨水收集系统定制的相关知识与详情&#xff0c; 1、三格化粪池&#xff0c;可设想为长方形或圆形。各粪池容积计较根据粪水储存时间定&#xff0c;即一般可按2&#xff1a;1&#xff1a;3计较。号池储存20天&#xff0c;2…

React脚手架学习笔记

一、前端工程的复杂化 如果我们只是开发几个小的demo程序&#xff0c;那么永远不需要考虑一些复杂的问题&#xff1a; 比如目录结构如何组织划分&#xff1b;比如如何管理文件之间的相互依赖&#xff1b;比如如何管理第三方模块的依赖&#xff1b;比如项目发布前如何压缩、打包…

access集团和abm_abm年度盛典,12月份,中国、澳大利亚、新西兰三地同时举办,abm各渠道运营商从全球各地赶来参会!...

十二月 &#xff0c;abm的各路年会分别在中国、澳大利亚、新西兰三国同时举办&#xff0c;abm各渠道运营商&#xff0c;从全球各地起来参会&#xff0c;先欣赏下abm全球年度盛典新西兰分会场中国区会场在abm中国区总部杭州举办&#xff0c;这次特别邀请了蔡康永&#xff0c;从上…

隐藏Android下的虚拟按键

隐藏Android下的虚拟按键 要隐藏Android下的虚拟按键&#xff0c;可通过如下办法操作 [cpp] view plaincopy adb root adb remount adb shell ls -al /system/build.prop (查看文件权限) -rw-r--r-- root root 4237 2015-11-19 04:34 build.prop adb …

医学影像设备学_2020考研:影像大咖告诉你,学影像,就业好,不求人。

医学学科里&#xff0c;有一门专业&#xff1a;医学影像&#xff0c;一直处于比较尴尬的地位&#xff1a;虽然是诊断医生&#xff0c;有执业医生证及大型设备上岗证&#xff0c;但是在同行眼里却是技师、拍片儿的。但是&#xff0c;最近几年医学影像专业迅速崛起&#xff0c;成…

React中添加class——借助第三方库classnames

一、vue中添加class vue中添加class是一件非常简单的事情&#xff1a; 你可以通过传入一个对象&#xff1a; 你也可以传入一个数组&#xff1a; 甚至是对象和数组混合使用&#xff1a; 二、React中添加class React在JSX给了我们开发者足够多的灵活性&#xff0c;你可以…

聊聊微服务架构

1. 微服务架构概念解析 2. 构建微服务架构&#xff1a;使用 API Gateway 3. 深入微服务架构的进程间通信 4. 服务发现的可行方案以及实践案例 5. 微服务的事件驱动数据管理 6. 选择微服务部署策略 7. 将单体应用改造为微服务 首先让我们了解为何要将微服务纳入考量。 构建单体应…

AntDesign组件库的使用

一、AntDesign的介绍 AntDesign &#xff0c;简称 antd 是基于 Ant Design 设计体系的 React UI 组件库&#xff0c;主要用于研发企业级中后台产品。 中后台的产品 属于工具性产品&#xff0c;很多优秀的设计团队通过自身的探索和积累&#xff0c;形成了自己的设计体系。 An…

socket.io跨域踩坑

一、koa结合socket.io 后端代码&#xff1a; // 引入依赖 const koa require("koa"); // 初始化koa const app new koa(); // 开启 http var server require("http").createServer(app.callback()); // 初始化 socket const io require("socket…

ios 权限提示语_iOS工作室都在用按键v1.6.1(体验版)

按键精灵iOS v1.6.1(体验版)已发布到cydia新增工作室专场还支持VIP自助换绑欢迎下载使用~源地址&#xff1a;http://apt.mobileanjian.comVIP换绑方法如下&#xff1a;1、在按键精灵APP上进入“我的”分页&#xff0c;点击VIP信息&#xff0c;看到“解绑”按钮。点击后&#xf…

Redux学习(一)——Redux的使用过程

一、为什么需要redux JavaScript开发的应用程序&#xff0c;已经变得越来越复杂了&#xff1a; JavaScript需要管理的状态越来越多&#xff0c;越来越复杂&#xff1b;这些状态包括服务器返回的数据、缓存数据、用户操作产生的数据等等&#xff0c;也包括一些UI的状态&#x…