位置: IT常识 - 正文

React的受控组件和非受控组件介绍(react受控和不受控组件的区别)

编辑:rootadmin
React的受控组件和非受控组件介绍 文章目录React受控和非受控组件认识受控组件受控组件演练认识非受控组件(了解)React受控和非受控组件认识受控组件

推荐整理分享React的受控组件和非受控组件介绍(react受控和不受控组件的区别),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:react受控组件页面不变化,react受控和不受控组件的区别,react受控组件input输入卡顿,react受控组件与非受控组件,react受控组件和非受控组件区别,react受控组件和非受控组件区别,react受控组件和非受控组件区别,react受控组件如何写,内容如对您有帮助,希望把文章链接给更多的朋友!

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

比如下面的HTML表单元素:

这个处理方式是DOM默认处理HTML表单的行为,在用户点击提交时会提交到某个服务器中,并且刷新页面;

在React中,并没有禁止这个行为,它依然是有效的;

但是通常情况下会使用JavaScript函数来方便的处理表单提交,同时还可以访问用户填写的表单数据;

实现这种效果的标准方式是使用“受控组件”;

export class App extends PureComponent { constructor() { super() this.state = { username: "" } } handleSubmitClick(event) { // 1.阻止默认行为, 防止提交页面刷新 event.preventDefault() // 2.获取到表单的数据 console.log(this.state.username) // 3.之后就可以发送网络请求提交到服务器 } changeUsername(event) { this.setState({ username: event.target.value }) } render() { const { username } = this.state return ( <div> <form onSubmit={e => this.handleSubmitClick(e)}> <label htmlFor="username"> 用户: <input type="text" name="" id="username" value={username} onChange={e => this.changeUsername(e)} /> </label> <button type='submit'>提交按钮</button> </form> </div> ) }}受控组件演练

input文本框

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

我们将两者结合起来,使React的state成为“唯一数据源”;

渲染表单的 React 组件还控制着用户输入过程中表单发生的操作;

被 React 以这种方式控制取值的表单输入元素就叫做“受控组件”;

React的受控组件和非受控组件介绍(react受控和不受控组件的区别)

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

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

export class App extends PureComponent { constructor() { super() this.state = { inputValue: "abcd" } } inputChange(event) { this.setState({ inputValue: event.target.value }) } render() { const { inputValue } = this.state return ( <div> <input type="text" value={inputValue} onChange={e => this.inputChange(e)}/> </div> ) }}

checkbox标签

texteare标签和input比较相似:

export class App extends PureComponent { constructor() { super() this.state = { isAgree: false } } handleSubmitClick(event) { // 1.阻止默认行为, 防止提交页面刷新 event.preventDefault() // 2.获取到表单的数据 console.log(this.state.isAgree) // 3.之后就可以发送网络请求提交到服务器 } inputChange(event) { this.setState({ isAgree: event.target.checked }) } render() { const { isAgree } = this.state return ( <div> <form onSubmit={e => this.handleSubmitClick(e)}> <label htmlFor="agree"> {/* 复选框绑定checked */} <input id="agree" type="checkbox" checked={isAgree} onChange={e => this.inputChange(e)} /> 同意协议 </label> <div> <button type='submit'>提交按钮</button> </div> </form> </div> ) }}

select标签

select标签的使用也非常简单,只是它不需要通过selected属性来控制哪一个被选中,它可以匹配state的value来选中。

export class App extends PureComponent { constructor() { super() this.state = { fruit: "apple" } } handleSubmitClick(event) { // 1.阻止默认行为, 防止提交页面刷新 event.preventDefault() // 2.获取到表单的数据 console.log(this.state.fruit) // 3.之后就可以发送网络请求提交到服务器 } changeSelect(event) { this.setState({ fruit: event.target.value }) } render() { const { fruit } = this.state return ( <div> <form onSubmit={e => this.handleSubmitClick(e)}> <select value={fruit} onChange={e => this.changeSelect(e)}> <option value="apple">苹果</option> <option value="orgin">橙子</option> <option value="banana">香蕉</option> </select> <div> <button type='submit'>提交按钮</button> </div> </form> </div> ) }}认识非受控组件(了解)

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

一个受控组件中,表单数据是由 React 组件来管理的

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

如果要使用非受控组件中的数据,那么我们需要使用 ref 来从DOM节点中获取表单数据。

我们来进行一个简单的演练:

使用ref来获取input元素;

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

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

export class App extends PureComponent { constructor() { super() this.state = { name: "chenyq" } this.nameRef = createRef() } handleSubmitClick(event) { // 1.阻止默认行为, 防止提交页面刷新 event.preventDefault() // 2.非受控组件获取值 console.log(this.nameRef.current.value) // 3.之后就可以发送网络请求提交到服务器 } componentDidMount() { // 再通过原生的方式监听变化, 不建议, 非受控组件还是在操作DOM // this.nameRef.current.addEventListener } render() { const { name } = this.state return ( <div> <input type="text" defaultValue={name} ref={this.nameRef} /> <div> <button type='submit'>提交按钮</button> </div> </form> </div> ) }}
本文链接地址:https://www.jiuchutong.com/zhishi/300794.html 转载请保留说明!

上一篇:【Vue全家桶】Pinia状态管理(vue全家桶学多久能上手项目)

下一篇:HTML网站导航栏的制作(htmlcss导航栏网页)

  • 抖音怎么把日常转为转发(抖音怎么把日常删除)

    抖音怎么把日常转为转发(抖音怎么把日常删除)

  • OPPO音量键代替电源键开机(OPPO音量键代替电源键软件)

    OPPO音量键代替电源键开机(OPPO音量键代替电源键软件)

  • oppo手机怎么取消拦截来电(oppo手机怎么取消耳机模式)

    oppo手机怎么取消拦截来电(oppo手机怎么取消耳机模式)

  • 磁卡在洗衣机里洗过了还能用吗(磁卡在洗衣机里洗衣机能正常运行吗)

    磁卡在洗衣机里洗过了还能用吗(磁卡在洗衣机里洗衣机能正常运行吗)

  • 华为畅享10e和10s的区别(华为畅享10e和10s屏幕一样大吗)

    华为畅享10e和10s的区别(华为畅享10e和10s屏幕一样大吗)

  • 腾讯网盘叫什么(腾讯云盘 百度网盘)

    腾讯网盘叫什么(腾讯云盘 百度网盘)

  • qq群最多能加多少人为上限(qq群可以加多少人才满)

    qq群最多能加多少人为上限(qq群可以加多少人才满)

  • h81主板配什么内存(h81主板哪个型号好)

    h81主板配什么内存(h81主板哪个型号好)

  • 手机重影是内屏坏了吗(手机重影内屏导致无法关机怎么办)

    手机重影是内屏坏了吗(手机重影内屏导致无法关机怎么办)

  • iphone8p怎么录屏(iphone8p如何录屏)

    iphone8p怎么录屏(iphone8p如何录屏)

  • 怎么插入公式(在word文档中怎么输入公式)

    怎么插入公式(在word文档中怎么输入公式)

  • 计算器上ac代表什么(计算器上ac是什么)

    计算器上ac代表什么(计算器上ac是什么)

  • 手机相机s什么意思(手机相机中的s是什么)

    手机相机s什么意思(手机相机中的s是什么)

  • 备忘录日期怎么显示(备忘录日期怎么设置农历的)

    备忘录日期怎么显示(备忘录日期怎么设置农历的)

  • 手机被标记房产中介怎么取消(手机被标记中介房产怎么取消)

    手机被标记房产中介怎么取消(手机被标记中介房产怎么取消)

  • iphonexs处理器是几核的(iphonexs处理器型号)

    iphonexs处理器是几核的(iphonexs处理器型号)

  • iphone11反向无线充电怎么使用(iphone11反向无线充电)

    iphone11反向无线充电怎么使用(iphone11反向无线充电)

  • vivo手机上不了网是什么原因(vivo手机上不了移动数据是什么原因)

    vivo手机上不了网是什么原因(vivo手机上不了移动数据是什么原因)

  • 伪基站是什么

    伪基站是什么

  • oppor9多少骁龙处理器(oppor9sk骁龙多少)

    oppor9多少骁龙处理器(oppor9sk骁龙多少)

  • 苹果地图怎么设置语言(苹果地图怎么设置公里英里)

    苹果地图怎么设置语言(苹果地图怎么设置公里英里)

  • qq邮箱能发送6g附件吗(Qq邮箱能发送文件夹吗)

    qq邮箱能发送6g附件吗(Qq邮箱能发送文件夹吗)

  • 猎豹浏览器如何缓存视频(猎豹浏览器如何卸载)

    猎豹浏览器如何缓存视频(猎豹浏览器如何卸载)

  • 基于乐吾乐核心库开发的组态编辑器-前端vue2+element,后端node+koa2+mysql5.7(乐吾实验学校网站)

    基于乐吾乐核心库开发的组态编辑器-前端vue2+element,后端node+koa2+mysql5.7(乐吾实验学校网站)

  • 增值税发票综合服务平台怎么下载
  • 增值税专用发票有效期是多长时间
  • 企业产生的所得税计入
  • 房地产开发企业资质管理规定
  • 暂估入账纳税调整填哪里
  • 农产品的税率是9%吗
  • 代付的费用收不收手续费
  • 以前年度出口退税申报
  • 小规模在税务局开的专票已交税,如何在税务平台申报
  • 出口退税贷款操作流程
  • 销售费用包括啥
  • 个人所得税申报操作流程
  • 单位购买预付卡
  • 2021年金税盘
  • 合伙制创投企业
  • 融资租赁咨询服务合同需要交印花税吗
  • 租赁行业的增值税税率
  • 应收账款补提坏账是什么意思
  • 商品过期可以向商家索要赔偿吗
  • 月末收到一批b材料,结算凭证未到,估价50000
  • 没有座机怎么填固定电话
  • 外埠纳税人经营地报验登记税务管理论文
  • 货物销售价比采购价高
  • 去办税大厅清卡需要带什么
  • 红字信息表跨越可以撤销吗
  • 出租包装物和出借包装物的摊销额
  • 建筑公司工地买空调
  • linux 如何查看网卡信息
  • 激活windows11怎么激活
  • 未开票收入申报后又要开票
  • win10电脑屏幕颜色变了怎么调到原来的
  • windows更新暂停怎么恢复
  • jdk1.8环境变量设置
  • 免抵退税怎么做账
  • php怎么定义全局变量
  • 银行承兑汇票的会计分录
  • 房产税具体内容
  • 售后租回交易的实质是什么
  • 所有者权益类的期末余额公式
  • php追加写入
  • 我想看阿尔伯塔
  • 购买材料结转成本的会计分录
  • 预提费用的账务处理
  • 前端打印语句
  • 差旅费车票抵扣的相关规定
  • 行政单位捐赠收入属于什么收入
  • 未注销的坏账可以处理吗
  • aws documentation
  • python怎样学
  • 预缴税款表怎么打印出来
  • 财务费用为负的意思
  • 财政补助结转的会计科目
  • wordpress图片大小设置
  • 成本费用利润率是什么指标
  • 个人所得税修改密码怎么改
  • 上个月计提多了,这个月怎么办?
  • 车船税手续费返还时间
  • 研发产品收入的会计分录
  • 销项税计提多了
  • 逐步测试法计算内含报酬率
  • 资本公积转增股本所有者权益会变吗
  • 民非企业怎么给员工交五险
  • 零星采购多少不需要发票
  • 增值税其他收益包括哪些
  • 建总账的注意事项
  • sql中的非逻辑
  • linux存在的意义
  • vrvarp.exe是什么
  • efi shell有什么用
  • win8 休眠
  • preorder遍历
  • linux怎么解压.gz
  • firefox document
  • 详解16型人格
  • vue-cal
  • html标签页效果
  • 安卓手机怎么导入地图
  • android 实例
  • 电子税务局怎么添加银行账户信息
  • 近亲房屋赠与免税费
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设