React--事件处理

React中的事件处理

  React 中文官网中有提到:"你必须谨慎对待 JSX 回调函数中的 this,类的方法默认是不会绑定 this 的" 。 "这并不是 React 的特殊行为;它是函数如何在 JavaScript 中运行的一部分"  。因此,如果忘记绑定,对应函数的 this 的值会是 undefined。当然,在没有用到函数的 this 的时候,绑定就不是必要的了。下面主要是从两个部分对 React 中的事件处理进行理解:第一部分是事件函数仅在在当前组件中进行事件处理,第二部分是将事件函数传递给其他组件进行事件处理。每部分分为用到 this 的事件函数,和没有用到 this 的事件函数。第一部分中例子使用没有传递参数,第二部分中使用参数。最后例中也同样展示了函数的几种绑定方式。

一、事件处理:事件函数仅在在当前组件中(例中没有传递参数,传递参数的情况与之类似)

1、没有用到事件处理程序中的 this 时

代码如下:

 1 var React = require(‘react‘);
 2 var ReactDOM = require(‘react-dom‘);
 3 class Index extends React.Component {
 4     constructor() {
 5         super(); //调用基类的所有的初始化方法
 6          7     };
 8
 9     showName(){
10         alert(‘username: "Guang"‘);
11     }
12
13     render() {
14         return (
15             <div>
16                         {/* 传递数据: 不传递参数或者有传递参数但是不涉及事件处理程序中的 this ,对事件处理程序的绑定:不是必须的 */}
17                         <input type="button" value="显示名称 没有绑定" onClick={this.showName}></input><br></br>
18                         <input type="button" value="显示名称 箭头函数绑定" onClick={()=>this.showName()}></input><br></br>
19                         <input type="button" value="显示名称 bind绑定" onClick={this.showName.bind(this)}></input>
20                         {/* 也可以在构造函数中通过: this.showName=this.showName.bind(this); 语句来绑定 */}
21             </div>
22         );
23     }
24 }
25 ReactDOM.render(
26     <Index/>, document.getElementById(‘example‘));

运行结果:

2、用到事件处理程序中的 this 时

代码如下:

 1 var React = require(‘react‘);
 2 var ReactDOM = require(‘react-dom‘);
 3 class Index extends React.Component {
 4     constructor() {
 5         super(); //调用基类的所有的初始化方法
 6         this.state = {
 7             username: "Guang",
 8             age: 20,
 9             newage1:"9 changeAge1",
10             newage2:"99 changeAge2",
11             newage3:"999 changeAge3"
12         };
13     };
14
15     changeAge1(){
16         this.setState({age:this.state.newage1});
17     };
18     changeAge2(){
19         this.setState({age:this.state.newage2});
20     };
21     changeAge3(){
22         this.setState({age:this.state.newage3});
23     };
24
25     render() {
26         return (
27             <div>
28                 <p>age:{this.state.age}</p>
29                 {/* 传递数据: 不传递参数但是涉及到事件处理程序中的 this ,对事件处理程序的绑定:是必须的 */}
30                 <input type="button" value="更改 age, 没有绑定" onClick={this.changeAge1}></input><br></br>
31                 <input type="button" value="更改 age, 箭头函数绑定" onClick={()=>this.changeAge2()}></input><br></br>
32                 <input type="button" value="更改 age, bind绑定" onClick={this.changeAge3.bind(this)}></input>
33                 {/* 也可以在构造函数中通过: this.changeAge3=this.changeAge3.bind(this); 语句来绑定 */}
34             </div>
35         );
36     }
37 }
38 ReactDOM.render(
39     <Index/>, document.getElementById(‘example‘));

运行结果: 可以看到,在需要用到事件处理程序中的 this 时,如果没有对事件处理程序进行绑定,会报错。而对事件处理程序进行绑定后正确运行

  

二、事件处理:事件函数传递到其他组件中(例中有传递参数,没有传递参数的情况与之类似)

1、没有用到事件处理程序中的 this 时(当传递的参数只有事件对象无其他数据时)

父组件代码如下:

 1 var React = require(‘react‘);
 2 var ReactDOM = require(‘react-dom‘);
 3 import BodyChild from ‘./components/bodychild‘;
 4 class Index extends React.Component {
 5
 6     // 该函数将获取的事件保持在 this.state.eventobject 中
 7     parentEventHandler(e){
 8         alert(e.target.value);
 9     }
10
11     render() {
12         return (
13             <div>
14                     {/* 事件处理:事件函数传递给其他组件 */}
15                     {/* 传递的数据: 传递参数 只有事件对象 无其他数据 但是没有用到事件处理程序的 this */}
16                     <BodyChild
17                         // 匿名函数赋值给子组件的 this.props.childAnonymous ,匿名函数后面的 bind(this) 是传入当前上下文,使得匿名函数内的 this 为当前上下文
18                         childAnonymous={function(e){this.parentEventHandler(e)}.bind(this)}
19                         // 箭头函数将函数 this 设置为当前上下文
20                         childArrow={(e)=>this.parentEventHandler(e)}
21                         // 使用 bind 将函数 this 设置为当前上下文
22                         childBind={this.parentEventHandler.bind(this)}
23                         // 也可以在构造函数中通过: this.childBind=this.parentEventHandler.bind(this) 语句来绑定
24                     />
25             </div>
26         );
27     }
28 }
29 ReactDOM.render(
30     <Index/>, document.getElementById(‘example‘));

子组件代码如下:

 1 import React from ‘react‘;
 2 export default class BodyChild extends React.Component{
 3
 4   render(){
 5     return(
 6       <div>
 7             {/* 匿名函数后面的 bind(this) 是传入当前上下文,使得匿名函数内的 this 为当前上下文 */}
 8             <input type="button" value="childAnonymous 匿名函数传参 无绑定" onClick={function(e){this.props.childAnonymous(e)}}></input><br></br>
 9             <input type="button" value="childAnonymous 匿名函数传参 匿名函数使用 bind 绑定" onClick={function(e){this.props.childAnonymous(e)}.bind(this)}></input><br></br>
10
11             {/*
12                 对于箭头函数绑定过程的个人理解
13                 使用箭头函数 this 被设置为当前箭头函数所在的上下文,其原理有点类似于下面的过程(并不是说过程就是这样的,只是原理与之类似,个人理解)
14                 源代码:
15                 <input type="button" onClick={(parameters)=>FunctionName(parameters)}/></input>
16                 过程原理:
17                 function anonymous(parameters){
18                   // 通过某种方式,将函数绑定当前上下文,将 this 设置为当前上下文(比如: FunctionName.bind(当前上下文))
19                   // 通过某种方式,将参数 parameters 传递给 FunctionName(比如:FunctionName(parameters))
20                 }
21                 <input type="button" onClick=anonymous /></input>
22             */}
23             <input type="button" value="childArrow 箭头函数传参 箭头函数绑定" onClick={(e)=>this.props.childArrow(e)}></input><br></br>
24
25             {/* 通过箭头函数的方式,事件对象必须显式的进行传递,但是通过 bind 的方式,事件对象以及更多的参数将会被隐式的进行传递。 */}
26             <input type="button" value="childBind 直接传参 bind 绑定" onClick={this.props.childBind.bind(this)}></input>
27         </div>
28     )
29   }
30 }

运行结果:可以看到,在没有用到 this 时候,由于需要通过 this 来获取当前组件中的函数,因此需要绑定函数

2、用到函数的 this 的情况(由于不需要用到 this 时,在不同组件间传递函数都需要绑定,因此,用到 this 的情况下必然要绑定)

原文地址:https://www.cnblogs.com/go4it/p/9556255.html

时间: 2024-10-11 22:14:31

React--事件处理的相关文章

为什么React事件处理函数必须使用Function.bind()绑定this?

最近在React官网学习Handling Events这一章时,有一处不是很明白.代码如下: class Toggle extends React.Component { constructor(props) { super(props); this.state = {isToggleOn: true}; // This binding is necessary to make `this` work in the callback this.handleClick = this.handleC

React事件处理

事件处理直接参考了慕课网上的教程,然后自己根据教程来编写实例,通过下面的实例可以很清晰地理解React的事件处理,其中需要注意的是索引refs! <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://cdn.bootcs

(转)React事件处理函数必须使用bind(this)的原因

1.JavaScript自身特性说明如果传递一个函数名给一个变量,之后通过函数名()的方式进行调用,在方法内部如果使用this则this的指向会丢失.示例代码:首先我们创建test对象并直接调用方法 : const test = { name:'jack', getName:function(){ console.log(this.name) }}test.getName()1234567使用node test.js执行上述代码可以正常输出jack. 之后,我们对代码进行调整: const te

React 事件处理函数

触摸事件:onTouchCancel\onTouchEnd\onTouchMove\onTouchStart (只会在移动设备上接受) 键盘事件:onKeyDown\onKeyPress\onKeyUp 剪切事件:onCopy\onCut\onPaste 表单事件:onChange\onInput\onSubmit 焦点事件:onFocus\onBlur UI元素:onScroll(移动设备是手指滚动和PC的鼠标滑动) 滚动事件:onWheel(鼠标滚轮) 鼠标类型:onClick\onCont

React框架

# React框架 ##梳理笔记: **属性设置`style={{marginLeft:"10px"}}`** **添加自定义属性需要使用 data- 前缀** **在 JSX 中使用 JavaScript 表达式.表达式写在花括号 {} 中** **在 JSX 中不能使用 if else 语句,但可以使用 conditional (三元运算) 表达式来替代** ```js render(){ return( <div> <h1>{i == 1 ? 'True!

我们一起来详细的了解react的语法以及组件的使用方法

jsx的介绍 React 使用 JSX 来替代常规的 JavaScript. JSX 是一个看起来很像 XML 的 JavaScript 语法扩展. jsx的优点 JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化. 它是类型安全的,在编译过程中就能发现错误. 使用 JSX 编写模板更加简单快速. JSX的使用方法 独立文件 内联样式 注释 JSX的语法 JavaScript 表达式的使用 三元运算的使用 数组化标签 关于组件 函数定义了一个组件: 函数定义名字使用驼峰方法

Reactjs 入门基础(三)

State 和 Props以下实例演示了如何在应用中组合使用 state 和 props .我们可以在父组件中设置 state, 并通过在子组件上使用 props 将其传递到子组件上.在 render 函数中, 我们设置 name 和 site 来获取父组件传递过来的数据. Props 验证 Props 验证使用 propTypes,它可以保证我们的应用组件被正确使用,React.PropTypes 提供很多验证器 (validator) 来验证传入数据是否有效.当向 props 传入无效数据时

百度面经

1. 计算机网络TCP的三次握手和四次挥手,画图并解释. 为什么不用4次握手 2. bootstrap的tab页面是怎么实现的 3. react的事件处理函数 4. ES6了解哪些 5. 箭头函数和普通函数的区别,举例说明 6. react事件处理函数的箭头函数的写法 7. array的遍历函数中哪些可以break出来 8. Sass的特点,css预处理的好处 ****把react项目再好好复习

React 组件的生命周期API和事件处理

一.简单记录React的组件的简洁的生命周期API: A:实例化期: 一个实例第一次被创建时所调用的API与其它后续实例被创建时所调用的API略有不同. 实例第一次被创建时会调用getDefaultProps,而后续实例创建时不会调用这个方法. 实例被创建时,依次被调用的API有: getDefaultProps: 实例第一次被创建时才调用,对于组件类来说,它只调用一次. 这个方法返回的对象可为实例设置默认的props值. getInitialState: 对于每个实例来说,这个方法只调用一次.

React 深入系列5:事件处理

文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列5:事件处理 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加深对React的理解,以及在项目中更加灵活地使用React. Web应用中,事件处理是重要的一环,事件处理将用户的操作行为转换为相应的逻辑执行或界面更新.在React中,处理事件响应的方式有多种,本文将详细介绍每一种处理方式的用法.使用场景和优缺点. 使用匿名函数 先上代码: //代码1 class MyCo