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>
    );}
}

这个语法的问题就是当LoggingButton组件每一次渲染的时候一个不同的回调函数就会被创建。在大多数情况下,这没有什么问题。然而,如果这个回调函数被当做一个props传递给子组件,那么那些子组件可能会做一次重新渲染。我们通常建议将方法在构造函数里绑定一下this或者使用属性初始化语法,这样可以避免这一类重复创建的问题。
向事件处理程序传递参数
通常我们会为事件处理程序传递额外的参数。例如,若是 id 是你要删除那一行的 id,以下两种方式都可以向事件处理程序传递参数:
<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文档(七)处理事件相关推荐

  1. React文档(一)安装

    React是一个灵活的可以用于各种不同项目的框架,你可以用它来写新应用,你也可以逐步将它引进已有的代码库而不用重写整个项目. 试用React 如果你想玩一玩React,那么就去CodePen上试一试. ...

  2. React文档 state and lifecycle

    状态和生命周期 这篇介绍 React 组件中状态和声明周期的概念.详情可以查看API参考 . 思考前一部分中时钟的例子.渲染元素中,我们仅学习了一种更新 UI 的方式.调用 ReactDOM.rend ...

  3. React文档(六)state和生命周期

    想一下之前的章节时钟的例子. 目前为止我们只学习了一直方式去更新UI. 我们调用ReactDOM.render()方法去改变渲染的输出: function tick() {const element ...

  4. React文档(十四)深入JSX

    根本上,JSX只是为React.createElement(component, props, ...children)函数提供语法糖.JSX代码是这样的: <MyButton color=&q ...

  5. React文档(五)组件和props

    组件可以让你将UI分割成独立的,可复用的模块,然后考虑将每个模块彼此隔离. 从概念上理解,组件就像js中的函数.他们接受随意的输入(被称为props)然后返回React元素来描述屏幕上应该出现什么. ...

  6. React文档(十九)不使用ES6

    通常你会将一个React组件定义成一个普通的js类: class Greeting extends React.Component {render() {return <h1>Hello, ...

  7. React文档(十八)最佳性能

    在内部,React使用好几种聪明的技巧去最小化更新UI所需要的DOM操作.对于很多应用来说,使用React会使得构建用户界面非常之快而且不需要做太多专门的性能优化.虽然如此,还是有一些方法可以让你为R ...

  8. Onsen UI for React文档

    注:采用ES6+JSX语法 1.开始一个项目 在React中使用Onsen UI 需要首先安装onsenui和react-onsenui模块. 可以使用monaca CLI工具包快速初始化一个应用: ...

  9. React文档(十五)使用propTypes进行类型检查

    注意: React.PropTypes 自 React v15.5 起已弃用.请使用 prop-types 库代替. 随着你的应用的开发,你会使用类型检查的方法来捕获很多bug.对于一些应用,你可以使 ...

最新文章

  1. 华为阿里下班时间曝光:所有的光鲜,都有加班的味道...
  2. python3.6安装教程-python3.6环境安装+pip环境配置教程图文详解
  3. spring Transaction Management --官方
  4. 【WPF】提高InkAnalyer手写汉字识别的准确率
  5. JSON字符串与JSON对象的区别
  6. elasticsearch工具类_Django + Elasticsearch——搜索精彩的TED演讲
  7. i美股投资研报--Michael Kors(IPO版) _Michael Kors(KORS) _i美股
  8. opencv漫水填充算法
  9. 移动短信回执怎么开通_微信短视频直播怎么做?
  10. css中文本超出部分省略号代替
  11. Matlab遥感图像分波段,组合显示
  12. 第三集 be 动词一般动词的过去式
  13. 垃圾大学,想自学 Java 可以吗?难吗?毕业后能找到一份 6k左右的工作吗?
  14. Signal protocol 开源协议理解
  15. vue的SEO优化——预渲染后路由+点击事件失效问题解决
  16. Neat Download Manager(ndm下载器)
  17. 什么是大数据,大数据的处理流程介绍
  18. 沈国军标签:零售业叛徒 马云的朋友 无所不能的怪兽
  19. 石油远程《机械设计》第三次在线作业
  20. 计算机毕业设计PHP基于Web的软考题库平台(源码+程序+VUE+lw+部署)

热门文章

  1. 临床研究有哪些类型对于小白来说容易上手?
  2. python判断英文字母_Python判断两个单词的相似度
  3. Android studio | Android studio下APP目录工程结构详解
  4. C++练习 | C++中Vector的使用
  5. Debug下正常,而Release失败的真正原因
  6. memkind版本查看_QQ 20周年来啦!扫码查看你的回忆
  7. 关于计算机和人物的英语短文,人脑和电脑英语作文
  8. linux lanmp 安装教程,linux服务器一键安装包lanmp系列教程之一
  9. 范式青春er,寻找同行的你!
  10. C指针原理(36)-C快速入门