详细分析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 相关文章推荐
二级域名或跨域共享Cookies的实现方法
Aug 07 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
Dec 27 Javascript
js导出txt示例代码
Jan 14 Javascript
js时间日期格式化封装函数
Dec 02 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
Mar 02 Javascript
jQuery文字横向滚动效果的实现代码
May 31 Javascript
javascript设置文本框光标的方法实例小结
Nov 04 Javascript
angularjs中使用ng-bind-html和ng-include的实例
Apr 28 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
Nov 15 Javascript
angular6的响应式表单的实现
Oct 10 Javascript
vue中的router-view组件的使用教程
Oct 23 Javascript
通过实例解析json与jsonp原理及使用方法
Sep 27 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
Linux环境下搭建php开发环境的操作步骤
2013/06/17 PHP
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
PHP实现WebService的简单示例和实现步骤
2015/03/27 PHP
php自动加载方式集合
2016/04/04 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
JavaScript异步编程Promise模式的6个特性
2014/04/03 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
jQuery内容过滤选择器用法分析
2015/02/10 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
JavaScript 模块的循环加载实现方法
2015/12/13 Javascript
基于jQuery的时间戳与日期间的转化
2019/06/21 jQuery
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
[00:17]DOTA2荣耀之路5:It’s a disastah!
2018/05/28 DOTA
在Python中处理字符串之ljust()方法的使用简介
2015/05/19 Python
总结Python编程中函数的使用要点
2016/03/20 Python
python利用正则表达式提取字符串
2016/12/08 Python
Python使用requests发送POST请求实例代码
2018/01/25 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
python遍历文件目录、批量处理同类文件
2019/08/31 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
秘书行业自我鉴定范文
2013/12/30 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android
MySQL新手入门进阶语句汇总
2022/09/23 MySQL