详细分析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 相关文章推荐
优秀js开源框架-jQuery使用手册(1)
Mar 10 Javascript
CutePsWheel javascript libary 控制输入文本框为可使用滚轮控制的js库
Feb 07 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
Mar 06 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
Sep 24 Javascript
使用jQueryMobile实现滑动翻页效果的方法
Feb 04 Javascript
jQuery实现的自适应焦点图效果完整实例
Aug 24 Javascript
详解webpack异步加载业务模块
Jun 23 Javascript
让axios发送表单请求形式的键值对post数据的实例
Aug 11 Javascript
详解angular应用容器化部署
Aug 14 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
May 08 Javascript
基于Vue 撸一个指令实现拖拽功能
Oct 09 Javascript
javascript canvas检测小球碰撞
Apr 17 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新手上路(十一)
2006/10/09 PHP
关于php curl获取301或302转向的网址问题的解决方法
2011/06/02 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
php的GD库imagettftext函数解决中文乱码问题
2015/01/24 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
利用javascript实现web页面中指定区域打印
2013/10/30 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
2016/09/06 Javascript
JavaScript中清空数组的三种方式
2017/03/22 Javascript
重新理解JavaScript的六种继承方式
2017/03/24 Javascript
Js实现京东无延迟菜单效果实例(demo)
2017/06/02 Javascript
Easyui在treegrid添加控件的实现方法
2017/06/23 Javascript
Angular刷新当前页面的实现方法
2018/11/21 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
原生js实现随机点名功能
2019/11/05 Javascript
微信公众号服务器验证Token步骤图解
2019/12/30 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
[01:46]2020完美世界全国高校联赛秋季赛报名开启
2020/10/15 DOTA
python模拟鼠标拖动操作的方法
2015/03/11 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
2016/05/25 Python
python3 发送任意文件邮件的实例
2018/01/23 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
煤矿安全生产标语
2014/06/06 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
宣传口号大全
2014/06/16 职场文书
投诉信格式范文
2015/07/02 职场文书
观看安全警示教育片心得体会
2016/01/15 职场文书
85句关于理想的名言警句大全
2019/08/22 职场文书
Oracle笔记
2021/04/05 Oracle
基于Go语言构建RESTful API服务
2021/07/25 Golang