React文档(七)处理事件
React元素处理事件和DOM元素处理事件很类似。下面是一些语法的不同之处:
- React事件的命名是用驼峰命名,而不是小写字母。
- 利用JSX你传递一个函数作为事件处理器,而不是一个字符串。
举个例子,这是一段HTML:
<button οnclick="activateLasers()">Activate Lasers </button>
而在React中略微有些不同:
<button onClick={activateLasers}>Activate Lasers </button>
另一个不同之处就是在React中你不能通过返回false来阻止事件默认的行为。你必须调用preventDefault。举个例子,一个简单的页面,为了阻止默认的链接行为打开一个新页面,你可以这样写:
<a href="#" οnclick="console.log('The link was clicked.'); return false">Click me </a>
在React中就得这样写:
function ActionLink() {function handleClick(e) {e.preventDefault();console.log('The link was clicked.');}return (<a href="#" onClick={handleClick}>Click me</a> ); }
在这里,e是一个综合的事件。React通过W3C标准来定义这些综合事件,所以你可以不用担心跨浏览器兼容性问题。看看SyntheticEvent手册学习更多知识。
当使用React你通常不需要调用addEventListener来向一个被创建的DOM元素添加事件监听器。只需要当元素首次被渲染的时候提供一个监听器。
当你使用ES6的类定义了一个组件,一个相同的模式就是一个事件监听器会是类的一个方法。举个例子,这个Toggle组件渲染了一个按钮来让用户在打开和关闭的状态中来回变化:
class Toggle extends React.Component {constructor(props) {super(props);this.state = {isToggleOn: true};// This binding is necessary to make `this` work in the callbackthis.handleClick = this.handleClick.bind(this); //bind方法会将函数handleClick的this设置为提供的this}handleClick() {this.setState(prevState => ({isToggleOn: !prevState.isToggleOn}));}render() {return (<button onClick={this.handleClick}>{this.state.isToggleOn ? 'ON' : 'OFF'}</button> );} }ReactDOM.render(<Toggle />,document.getElementById('root') );
在CodePen中试一试。
你必须谨慎对待 JSX 回调函数中的 this,类的方法默认是不会绑定 this 的。如果你忘记绑定 this.handleClick 并把它传入 onClick, 当你调用这个函数的时候 this 的值会是 undefined。
这并不是React的特殊行为;而是函数如何在js中工作的一部分。通常,如果你涉及到了一个后面没有()的方法,就像onClick={this.handleClick},你应该为那个函数调用bind方法改变它的this。
如果调用bind使你厌烦,还有两种方法可以避免使用bind。如果你使用实验性的属性初始化语法,你可以使用属性初始化来正确地绑定回调:
class LoggingButton extends React.Component {// This syntax ensures `this` is bound within handleClick.// Warning: this is *experimental* syntax.handleClick = () => {console.log('this is:', this);}render() {return (<button onClick={this.handleClick}>Click me</button> );} }
这个语法在Create React App中默认开启。
如果你不使用属性初始化语法,你可以在回调里使用箭头函数:
class LoggingButton extends React.Component {handleClick() {console.log('this is:', this);}render() {// This syntax ensures `this` is bound within handleClickreturn (<button onClick={(e) => this.handleClick(e)}>Click me</button> );} }
<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button> <button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>
上述两种方式是等价的,分别通过 arrow functions 和 Function.prototype.bind 来为事件处理函数传递参数。
上面两个例子中,参数 e 作为 React 事件对象将会被作为第二个参数进行传递。通过箭头函数的方式,事件对象必须显式的进行传递,但是通过 bind 的方式,事件对象以及更多的参数将会被隐式的进行传递。
值得注意的是,通过 bind 方式向监听函数传参,在类组件中定义的监听函数,事件对象 e 要排在所传递参数的后面,例如:
class Popper extends React.Component{constructor(){super();this.state = {name:'Hello world!'};}preventPop(name, e){ //事件对象e要放在最后 e.preventDefault();alert(name);}render(){return (<div><p>hello</p>{/* Pass params via bind() method. */}<a href="https://reactjs.org" onClick={this.preventPop.bind(this,this.state.name)}>Click</a></div> );} }
转载于:https://www.cnblogs.com/hahazexia/p/6385750.html
React文档(七)处理事件相关推荐
- React文档(一)安装
React是一个灵活的可以用于各种不同项目的框架,你可以用它来写新应用,你也可以逐步将它引进已有的代码库而不用重写整个项目. 试用React 如果你想玩一玩React,那么就去CodePen上试一试. ...
- React文档 state and lifecycle
状态和生命周期 这篇介绍 React 组件中状态和声明周期的概念.详情可以查看API参考 . 思考前一部分中时钟的例子.渲染元素中,我们仅学习了一种更新 UI 的方式.调用 ReactDOM.rend ...
- React文档(六)state和生命周期
想一下之前的章节时钟的例子. 目前为止我们只学习了一直方式去更新UI. 我们调用ReactDOM.render()方法去改变渲染的输出: function tick() {const element ...
- React文档(十四)深入JSX
根本上,JSX只是为React.createElement(component, props, ...children)函数提供语法糖.JSX代码是这样的: <MyButton color=&q ...
- React文档(五)组件和props
组件可以让你将UI分割成独立的,可复用的模块,然后考虑将每个模块彼此隔离. 从概念上理解,组件就像js中的函数.他们接受随意的输入(被称为props)然后返回React元素来描述屏幕上应该出现什么. ...
- React文档(十九)不使用ES6
通常你会将一个React组件定义成一个普通的js类: class Greeting extends React.Component {render() {return <h1>Hello, ...
- React文档(十八)最佳性能
在内部,React使用好几种聪明的技巧去最小化更新UI所需要的DOM操作.对于很多应用来说,使用React会使得构建用户界面非常之快而且不需要做太多专门的性能优化.虽然如此,还是有一些方法可以让你为R ...
- Onsen UI for React文档
注:采用ES6+JSX语法 1.开始一个项目 在React中使用Onsen UI 需要首先安装onsenui和react-onsenui模块. 可以使用monaca CLI工具包快速初始化一个应用: ...
- React文档(十五)使用propTypes进行类型检查
注意: React.PropTypes 自 React v15.5 起已弃用.请使用 prop-types 库代替. 随着你的应用的开发,你会使用类型检查的方法来捕获很多bug.对于一些应用,你可以使 ...
最新文章
- 华为阿里下班时间曝光:所有的光鲜,都有加班的味道...
- python3.6安装教程-python3.6环境安装+pip环境配置教程图文详解
- spring Transaction Management --官方
- 【WPF】提高InkAnalyer手写汉字识别的准确率
- JSON字符串与JSON对象的区别
- elasticsearch工具类_Django + Elasticsearch——搜索精彩的TED演讲
- i美股投资研报--Michael Kors(IPO版) _Michael Kors(KORS) _i美股
- opencv漫水填充算法
- 移动短信回执怎么开通_微信短视频直播怎么做?
- css中文本超出部分省略号代替
- Matlab遥感图像分波段,组合显示
- 第三集 be 动词一般动词的过去式
- 垃圾大学,想自学 Java 可以吗?难吗?毕业后能找到一份 6k左右的工作吗?
- Signal protocol 开源协议理解
- vue的SEO优化——预渲染后路由+点击事件失效问题解决
- Neat Download Manager(ndm下载器)
- 什么是大数据,大数据的处理流程介绍
- 沈国军标签:零售业叛徒 马云的朋友 无所不能的怪兽
- 石油远程《机械设计》第三次在线作业
- 计算机毕业设计PHP基于Web的软考题库平台(源码+程序+VUE+lw+部署)
热门文章
- 临床研究有哪些类型对于小白来说容易上手?
- python判断英文字母_Python判断两个单词的相似度
- Android studio | Android studio下APP目录工程结构详解
- C++练习 | C++中Vector的使用
- Debug下正常,而Release失败的真正原因
- memkind版本查看_QQ 20周年来啦!扫码查看你的回忆
- 关于计算机和人物的英语短文,人脑和电脑英语作文
- linux lanmp 安装教程,linux服务器一键安装包lanmp系列教程之一
- 范式青春er,寻找同行的你!
- C指针原理(36)-C快速入门