react中的表单不同于基本的dom操作 他主要可分为 受控组件和非受控组件

这里我们先创建一个react项目

这里我们就直接将代码写在App.jsx里了

App.jsx参考代码如下

import './App.css';
import React from "react";class App extends React.Component{constructor(props){super(props);this.state = {}}render(){return (<div className="App"><form></form></div>)}
}export default App;

这里我们建立一个基本的组件 写了一个空的form表单
然后我们可以在form标签上绑定一个事件

<form onSubmit = { this.submit }>
</form>

react的 onSubmit是一个监听事件 当表单提交时就会触发
然后这个submit 方法我们可以自己写一下

submit(){}

这里我就简答定义一下这个方法 内容后面再写

然后我们在state中定义一个叫value 的空字符串

this.state = {value: ""
}

然后我们在form表单中写一个input输入框

<input type = "text" value = { this.state.value }></input>

可以看到 我们这个输入框关联了this.state下的value值 这样这个输入框就被我们的value管理了 value会和输入框的内容保持一致
这就是一种受控组件

但光这样写肯定是不行的

我们输入不了内容 而且会报错 意思就是少一个onChange事件来帮我们处理这个数据

我们将input的代码改一下

<input type = "text" onChange = { this.setValue } value = { this.state.value }></input>

这里绑定了 onChange 事件 然后这里我们定义的方法名叫 setValue 这个你们可以根据自己的情况给方法命名
setValue参考代码如下

setValue = (event)=>{this.setState({value: event.target.value})
}

这样在输入 这两个变量就同步了
内容就可以正常输入了

我们可以来测一下这个变量有没有和输入框同步

我们在form中定义一个提交按钮

<button type = "submit">提交</button>

现在点这个按钮表单就会提交
那么我们开始时 说过 form上绑定的onSubmit事件就是用来监听表单提交的
我们给他绑定了一个 submit 方法
现在我们来写一下submit 方法的内容

submit = ()=>{console.log(this.state.value);
}

然后我们在表单提交的方法中打印了绑定input的state.value
但我们运行之后会出现点击提交 一闪而过的问题
这是因为表单提交界面会跳转一下

我们将submit的代码改成

submit = (event)=>{event.preventDefault();console.log(this.state.value);
}

这就是一个js基础了 表单的提交事件接受一个event 调用event中的preventDefault就可以阻止表单的默认行为 他就不会乱跳了

然后我们再在输入框中输入一些内容
然后点击提交

这时我们就会发现 输出在控制台上的this.state.value 和我们输入框的内容是同步的

当然 大家可以设想一种情况 如果我们有好多的表单元素 他妈的值都需要控制 难道每一个都写一个onChange 吗?
不是我说 我都觉得麻烦

所以官方给我提供了第二种 非受控组件

我们在constructor中定义几个虚拟元素控制
参开代码如下

 constructor(props){super(props);this.userName = React.createRef()this.password = React.createRef()this.number = React.createRef()this.state = {value: ""}
}

然后我们改写form代码

<form onSubmit = { this.submit }><input type = "text" onChange = { this.setValue } value = { this.state.value }></input><input type = "text" ref = { this.userName }></input><input type = "password" ref = { this.password }></input><input type = "text" ref = { this.number }></input><button type = "submit">提交</button>
</form>

这时 我们新增加了三个输入框 分别绑定了 userName password number 元素
然后我们改一下一下提交监听的submit方法

submit = (event)=>{event.preventDefault();console.log(this.userName.current);console.log(this.password.current);console.log(this.number.current);
}

然后我们点击提交

可以看到 他打印的是这三个元素本身 那如果我们想要用户输入的值呢?

console.log(this.userName.current.value);
console.log(this.password.current.value);
console.log(this.number.current.value);

直接在元素后面.value就好啦

当然 一般情况建议大家还是用受控组件 除非真的是我好多输入框 写一大堆事件看着好乱 就用非受控组件

React表单 (受控组件,非受控组件)相关推荐

  1. reactjs中收集表单数据:非受控组件和受控组件

    1_非受控组件 <!DOCTYPE html> <html lang="en"> <head><meta charset="UT ...

  2. 重新认识受控和非受控组件

    该文章包含如下内容 受控与非受控组件非受控组件受控组件 受控和非受控组件边界 反模式 解决方案 前言 在 HTML 中,表单元素(<input>/<textarea>/< ...

  3. 查找DOM,受控与非受控组件

    1.查找dom节点 常用的方法有两种: 第一种常用的方法 1.在constructor中创建ref对象:this.变量 = React.createRef() 2.在标签中使用ref属性绑定创建的re ...

  4. 我们应该如何优雅的处理 React 中受控与非受控

    受控 & 非受控 今天来和大家简单聊聊 React 中的受控和非受控的概念. 提到受控和非受控相信对于使用过 React 的朋友已经老生常谈了,在开始正题之前惯例先和大家聊一些关于受控 &am ...

  5. 微信小程序(组件:路由、表单、媒体、自定义组件,插槽、组件通讯、侦听器、生命周期)

    三.微信小程序组件 组件就是小程序页面的组成结构,与html在web网页开发中的作用一样,铺设页面.可以参考其他UI库,像elementUI,vantUI组件 组件是视图层的基本组成单元. 组件自带一 ...

  6. React 表单源码阅读笔记

    1 概念 1.1 什么是表单 实际上广义上的表单并不是特别好界定,维基上讲表单是一系列带有空格的文档,用于输写或选择.更具体的,在网页中表单主要负责数据采集的功能,我们下文中所提到的表单都指后者.如下 ...

  7. React 表单与事件

    一个简单的实例 在实例中我们设置了输入框 input 值value = {this.state.data}.在输入框值发生变化时我们可以更新 state.我们可以使用 onChange 事件来监听 i ...

  8. php中表单的非空验证,Javascript的表单与验证-非空验证_javascript技巧

    JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证. 表单提交前要检查数据的合法性 在要对表单里的数据进行验证的时候,可以利用getElementById()来 ...

  9. javascript 校验 非空_Javascript的表单与验证-非空验证

    JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证. 表单提交前要检查数据的合法性 在要对表单里的数据进行验证的时候,可以利用getElementById()来 ...

最新文章

  1. php更改asp.net教程,ASP.NET 教程
  2. mseloss 与 smooth_l1_loss比较
  3. python画直方图成绩分析-python plotly绘制直方图实例详解
  4. EF架构~在global.asax里写了一个异常跳转,不错!
  5. sharepoint的入门知识
  6. php递归面包屑,php可应用于面包屑导航的递归寻找家谱树实现方法
  7. linux——不同系统间的文件传输和打包压缩
  8. aop简介-基于cglib的动态
  9. audio 上一首 下一首 自定义样式_被 iPhone 吹爆的最香功能,安卓也终于安排上了...
  10. html label标签 ie6,IE6 IE7 IE8三大浏览器的CSS兼容速查表
  11. FBI局长重提解锁iPhone 希望展开关于智能手机加密的讨论
  12. 【无人驾驶系列】基于ROS的无人驾驶系统
  13. Android自定义ToolBar布局
  14. mysql5和8怎么同时安装_WINDOWS服务器同时安装多个版本的MYSQL的方法,MQYSQL5和MQYSQL8的共存。...
  15. mysql data masking_Percona8.0.17的数据屏蔽插件的使用
  16. java新增mysql时 中文出现_Java项目往数据库中插入数据,出现中文乱码
  17. 比较详细的一份Google hacking语法 Google黑客
  18. excel怎么设置打印区域_彩色打印机怎么设置默认打印黑白色?
  19. 公众号商城怎么做_分享超市小程序商城开发制作介绍
  20. vue小案例(小黑记事本和购物车)

热门文章

  1. 字符串的反转以及巧用反转 ------关于反转,看这一篇就足够了
  2. treeselect 清空销毁树_antd———Tree结构之探索遍历及删除
  3. 用Python绘制樱花树、玫瑰花各种表白代码,从此不再缺女朋友
  4. 连接路由器的电脑到底是怎样上网的
  5. 【Ctfer训练计划】——(五)
  6. 树莓派实现远程控制空调
  7. 光环国际:项目管理者如何促进项目的按期交付——续华老师
  8. 阿里资深架构师推荐:技术人改如何提升源码阅读能力
  9. 全新MyZip for Mac(超快速解压/压缩工具)
  10. 颐和园终于上CSDN头条了