详细分析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的propertyIsEnumerable()方法使用介绍
Apr 09 Javascript
js四舍五入数学函数round使用实例
May 09 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
Dec 31 Javascript
vue.js 获取当前自定义属性值
Jun 01 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
Jul 11 Javascript
Vue.js移动端左滑删除组件的实现代码
Sep 08 Javascript
Angularjs cookie 操作实例详解
Sep 27 Javascript
详解Vue中localstorage和sessionstorage的使用
Dec 22 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
Dec 27 Javascript
webpack 模块热替换原理
Apr 09 Javascript
一个因@click.stop引发的bug的解决
Jan 08 Javascript
vue+mock.js实现前后端分离
Jul 24 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 分页分组类
2009/12/10 PHP
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
试用php中oci8扩展
2015/06/18 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
IOS 开发之NSDictionary转换成JSON字符串
2017/08/14 PHP
关于laravel 子查询 &amp; join的使用
2019/10/16 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
js window.open弹出新的网页窗口
2014/01/16 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
几句话带你理解JS中的this、闭包、原型链
2016/09/26 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
2017/12/28 Python
Python创建字典的八种方式
2019/02/27 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
JAVA中的关键字有什么特点
2014/03/07 面试题
西式婚礼证婚词
2014/01/12 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
毕业实习评语
2014/02/10 职场文书
市场营销专业毕业生求职信
2014/03/26 职场文书
升学宴主持词
2014/04/02 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
新教师个人工作总结
2015/02/06 职场文书
2015年学校保卫部工作总结
2015/05/11 职场文书
教师节获奖感言
2015/07/31 职场文书