详细分析React 表单与事件


Posted in Javascript onJuly 08, 2020

本章节我们将讨论如何在 React 中使用表单。

HTML 表单元素与 React 中的其他 DOM 元素有所不同,因为表单元素生来就保留一些内部状态。

在 HTML 当中,像 <input>, <textarea>, 和 <select> 这类表单元素会维持自身状态,并根据用户输入进行更新。但在React中,可变的状态通常保存在组件的状态属性中,并且只能用 setState() 方法进行更新。

一个简单的实例

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

class HelloMessage extends React.Component {
 constructor(props) {
  super(props);
  this.state = {value: 'Hello 3water!'};
  this.handleChange = this.handleChange.bind(this);
 }
 
 handleChange(event) {
 this.setState({value: event.target.value});
 }
 render() {
 var value = this.state.value;
 return <div>
   <input type="text" value={value} onChange={this.handleChange} /> 
   <h4>{value}</h4>
   </div>;
 }
}
ReactDOM.render(
 <HelloMessage />,
 document.getElementById('example')
);

上面的代码将渲染出一个值为 Hello 3water! 的 input 元素,并通过 onChange 事件响应更新用户输入的值。

实例 2

在以下实例中我们将为大家演示如何在子组件上使用表单。 onChange 方法将触发 state 的更新并将更新的值传递到子组件的输入框的 value 上来重新渲染界面。

你需要在父组件通过创建事件句柄 (handleChange) ,并作为 prop (updateStateProp) 传递到你的子组件上。

class Content extends React.Component {
 render() {
 return <div>
   <input type="text" value={this.props.myDataProp} onChange={this.props.updateStateProp} /> 
   <h4>{this.props.myDataProp}</h4>
   </div>;
 }
}
class HelloMessage extends React.Component {
 constructor(props) {
  super(props);
  this.state = {value: 'Hello 3water!'};
  this.handleChange = this.handleChange.bind(this);
 }
 
 handleChange(event) {
 this.setState({value: event.target.value});
 }
 render() {
 var value = this.state.value;
 return <div>
   <Content myDataProp = {value} 
    updateStateProp = {this.handleChange}></Content>
   </div>;
 }
}
ReactDOM.render(
 <HelloMessage />,
 document.getElementById('example')
);

运行结果

详细分析React 表单与事件

Select 下拉菜单

在 React 中,不使用 selected 属性,而在根 select 标签上用 value 属性来表示选中项。

class FlavorForm extends React.Component {
 constructor(props) {
 super(props);
 this.state = {value: 'coconut'};
 
 this.handleChange = this.handleChange.bind(this);
 this.handleSubmit = this.handleSubmit.bind(this);
 }
 
 handleChange(event) {
 this.setState({value: event.target.value});
 }
 
 handleSubmit(event) {
 alert('Your favorite flavor is: ' + this.state.value);
 event.preventDefault();
 }
 
 render() {
 return (
  <form onSubmit={this.handleSubmit}>
  <label>
   选择您最喜欢的网站
   <select value={this.state.value} onChange={this.handleChange}>
   <option value="gg">Google</option>
   <option value="rn">Runoob</option>
   <option value="tb">Taobao</option>
   <option value="fb">Facebook</option>
   </select>
  </label>
  <input type="submit" value="提交" />
  </form>
 );
 }
}
 
ReactDOM.render(
 <FlavorForm />,
 document.getElementById('example')
);

运行结果

详细分析React 表单与事件

多个表单

当你有处理多个 input 元素时,你可以通过给每个元素添加一个 name 属性,来让处理函数根据 event.target.name 的值来选择做什么。

class Reservation extends React.Component {
 constructor(props) {
 super(props);
 this.state = {
  isGoing: true,
  numberOfGuests: 2
 };
 
 this.handleInputChange = this.handleInputChange.bind(this);
 }
 
 handleInputChange(event) {
 const target = event.target;
 const value = target.type === 'checkbox' ? target.checked : target.value;
 const name = target.name;
 
 this.setState({
  [name]: value
 });
 }
 
 render() {
 return (
  <form>
  <label>
   是否离开:
   <input
   name="isGoing"
   type="checkbox"
   checked={this.state.isGoing}
   onChange={this.handleInputChange} />
  </label>
  <br />
  <label>
   访客数:
   <input
   name="numberOfGuests"
   type="number"
   value={this.state.numberOfGuests}
   onChange={this.handleInputChange} />
  </label>
  </form>
 );
 }
}

输出结果

详细分析React 表单与事件

React 事件

以下实例演示通过 onClick 事件来修改数据:

class HelloMessage extends React.Component {
 constructor(props) {
  super(props);
  this.state = {value: 'Hello 3water!'};
  this.handleChange = this.handleChange.bind(this);
 }
 
 handleChange(event) {
 this.setState({value: '三水点靠木'})
 }
 render() {
 var value = this.state.value;
 return <div>
   <button onClick={this.handleChange}>点我</button>
   <h4>{value}</h4>
   </div>;
 }
}
ReactDOM.render(
 <HelloMessage />,
 document.getElementById('example')
);

当你需要从子组件中更新父组件的 state 时,你需要在父组件通过创建事件句柄 (handleChange) ,并作为 prop (updateStateProp) 传递到你的子组件上。实例如下:

class Content extends React.Component {
 render() {
 return <div>
    <button onClick = {this.props.updateStateProp}>点我</button>
    <h4>{this.props.myDataProp}</h4>
   </div>
 }
}
class HelloMessage extends React.Component {
 constructor(props) {
  super(props);
  this.state = {value: 'Hello 3water!'};
  this.handleChange = this.handleChange.bind(this);
 }
 handleChange(event) {
 this.setState({value: '三水点靠木'})
 }
 render() {
 var value = this.state.value;
 return <div>
   <Content myDataProp = {value} 
    updateStateProp = {this.handleChange}></Content>
   </div>;
 }
}
ReactDOM.render(
 <HelloMessage />,
 document.getElementById('example')
);

运行结果

详细分析React 表单与事件

以上就是详细分析React 表单与事件的详细内容,更多关于React 表单与事件的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript 嵌套的函数(作用域链)
Mar 15 Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
Jul 15 Javascript
JavaScript显示当前文档最后修改日期的方法
Mar 19 Javascript
Bootstrap媒体对象的实现
May 01 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
Oct 04 Javascript
JS获取html元素的标记名实现方法
Oct 08 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
Sep 28 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
May 13 Javascript
webpack4 CSS Tree Shaking的使用
Sep 03 Javascript
微信小程序request请求封装,验签代码实例
Dec 04 Javascript
JS实现星星海特效
Dec 24 Javascript
js实现轮播图效果 纯js实现图片自动切换
Aug 09 Javascript
详解JavaScript之ES5的继承
Jul 08 #Javascript
jQuery使用jsonp实现百度搜索的示例代码
Jul 08 #jQuery
微信小程序拖拽排序列表的示例代码
Jul 08 #Javascript
基于javascript canvas实现五子棋游戏
Jul 08 #Javascript
深度解读vue-resize的具体用法
Jul 08 #Javascript
详解React 条件渲染
Jul 08 #Javascript
webpack5 联邦模块介绍详解
Jul 08 #Javascript
You might like
php批量删除数据库下指定前缀的表以prefix_为例
2014/08/24 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
Extjs在exlipse中设置自动提示的方法
2010/04/07 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
js验证真实姓名与身份证号,手机号的简单实例
2016/07/18 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
[17:36]VG战队纪录片
2014/08/21 DOTA
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
Python读写文件基础知识点
2019/06/10 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
Django 用户认证组件使用详解
2019/07/23 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
Python Pandas 对列/行进行选择,增加,删除操作
2020/05/17 Python
python爬取天气数据的实例详解
2020/11/20 Python
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
澳大利亚和新西兰最大的在线旅行社之一:Aunt Betty
2019/08/07 全球购物
毕业生文员求职信
2013/11/03 职场文书
初中政治教学反思
2014/01/17 职场文书
房地产财务管理制度
2014/02/02 职场文书
春游踏青活动方案
2014/08/14 职场文书
2015年超市工作总结范文
2015/05/26 职场文书
后天观后感
2015/06/08 职场文书
音乐研修感悟
2015/11/18 职场文书
年会邀请函的格式及范文五篇
2019/11/02 职场文书
解决python存数据库速度太慢的问题
2021/04/23 Python
SQL SERVER触发器详解
2022/02/24 SQL Server