React事件处理超详细介绍

 更新时间:2022年09月30日 09:42:34   作者:月光晒了很凉快  
这篇文章主要介绍了React事件处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 事件绑定

React 元素的事件处理和 DOM 元素的很相似,但是有一点语法上的不同:

React 事件的命名采用小驼峰式,而不是纯小写。

onClick => onChange

使用 JSX 语法时你需要传入一个函数作为事件处理函数,而不是一个字符串。

onClick={this.fn} // 绑定实现方法一定要用 {函数或方法};注意函数或方法不能用小括号

类组件与函数组件绑定事件是差不多的,只是在类组件中绑定事件函数的时候需要用到 this,代表指向当前的类的引用,在函数中不需要调用 this

1.1 函数组件

import React, { Component } from 'react'
// 函数组件中没有this指向问题
const App = () => {
  let num = 1
  const clickFn = () => {
    console.log(num++)
  }
  // const clickFn = () => () => {
  //   console.log(num++)
  // }
  return (
    <div>
      {/* 普通的值,它不具备响应式,所以你修改数据后,视图是不会更新的 */}
      <h3>App组件 -- {num}</h3>
      {/* 绑定点击事件 */}
      {/* 一般情况下,绑定的实现方法是不会加小括号,如果要加小括号,则定义绑定方法时,一定要返回一函数 */}
      <button onClick={clickFn}>++++</button>
      {/* <button onClick={clickFn()}>++++</button> */}
    </div>
  )
}
export default App

1.2 类组件

import React, { Component } from 'react'
class App extends Component {
  num = 100
  todos = []
  // 建议使用箭头函数定义成员属性
  addNum = () => {
    // 同步修改成员属性中的数据,但是视图不更新
    this.num++
    // 类组件中提供一个方法,可以强制让视图更新
    this.forceUpdate()
  }
  // react事件,在没有写小括号的时候会主动的把event对象传给你
  onEnter = evt => {
    if (evt.keyCode === 13) {
      this.todos.push({
        id: Date.now(),
        title: evt.target.value.trim(),
        done: false
      })
      evt.target.value = ''
      // 通知视图更新
      this.forceUpdate()
    }
  }
  render() {
    return (
      <div>
        <h3>{this.num}</h3>
        <ul>
          {this.todos.map(item => (
            <li key={item.id}>{item.title}</li>
          ))}
        </ul>
        {/* 
          类组件中绑定方法,有this指向问题
        */}
        <button onClick={this.addNum}>++++</button>
        <input type="text" onKeyUp={this.onEnter} />
      </div>
    )
  }
}
export default App

2. 合成事件

概述:

在原生 Dom 事件( html 中),假如我们给 button 按钮绑定点击事件,是绑定在 button 上去的。而这种情况在 React 中,不会在 button 上绑定事件,React 会将 Dom 中的事件进行收集,然后将事件委托到容器中(id=root,即挂载点)。

在 React16 及之前,React 将所有的事件都委托到 document 当中去,而在 React17 及之后,React 将所有的事件都委托到挂载点中去了。

为什么出现这个技术?

  • 性能优化:使用事件代理统一接收原生事件的触发,从而可以使得真实 DOM 上不用绑定事件。React 挟持事件触发可以知道用户触发了什么事件,是通过什么原生事件调用的真实事件。这样可以通过对原生事件的优先级定义进而确定真实事件的优先级,再进而可以确定真实事件内触发的更新是什么优先级,最终可以决定对应的更新应该在什么时机更新。
  • 分层设计:解决跨平台问题,抹平浏览器差异和平台差异。

3. 事件传参的3种不同写法

import React, { Component } from 'react';
class App extends Component {
  // 在react中事件对象,它是通过事件参数传给方法的
  // 参数空着,会默认绑定事件
  fn = () => {
    console.log('fn')
  }
  // 又想传参,又想触发事件得这么写,evt会自动映射过来,注意最后一个箭头前只能是 evt 对象
  fn1 = num => evt => {
    console.log(num, evt);
  }
  // 这种写法是可以随意变更 evt 对象传参过来的位置
  fn2 = (num, evt) => {
    console.log(num, evt);
  }
  render() {
    return (
      <div>
        {/* onClick={ 注意:花括号里是函数的表达式,而不是函数的调用 } */}
        <button onClick={this.fn}>绑定点击事件</button>
        <button onClick={this.fn1(100)}>绑定点击事件</button>
        <button onClick={evt => this.fn2(200, evt)}>绑定点击事件</button>
      </div>
    );
  }
}
export default App;

4. this 指向问题

在JSX事件函数方法中的 this,默认不会绑定 this 指向。如果你忘记绑定,当你调用这方法的时候,this 的值为 undefined。所以使用时一定要绑定好 this 的指向。

this 指向针对的是类组件,函数组件没有 this 问题,因为函数没有 this 。

利用 bind 函数绑定 this 指向:

import React, { Component } from 'react';
class App extends Component {
  num = 100
  // 类的构造函数,它只执行1次,在初始化
  // constructor(props) {
  //   super(props);
  //   // 在构建函数中统一的把事件方法this绑定好
  //   this.addNum = this.addNum.bind(this)
  // }
  // 在react事件绑定的类组件中,默认情况this指向会可能存在指向问题  undefined
  // 在绑定事件中绑定this调用函数时的写法
  addNum(n = 1) {
    this.num += n
    this.forceUpdate()
  }
  // 构造函数中绑定this调用函数时的写法,因为不传值第一个参数会
  // addNum(evt, n = 1) {
  //   this.num += n
  //   this.forceUpdate()
  // }
  render() {
    return (
      <div>
        <h3>{this.num}</h3>
        {/* 在此处可以使用bind来绑定this指向(this指向 App 实例),且还可以传参数 */}
        {/* 此方案在使用中,较多 */}
        {/* <button onClick={this.addNum.bind(this)}>累加</button> */}
        <button onClick={this.addNum.bind(this, 2)}>累加</button>
        {/* 如果你这样写,又想this指向对,则一定要在构造函数中,解决好this指向 */}
        {/* <button onClick={this.addNum}>累加</button> */}
      </div>
    );
  }
}
export default App;

注意:使用 bind 绑定 this 共有两种方案,一种是调用函数时绑定,一种是在构造函数中统一绑定。

利用箭头函数解决 this 指向:

import React, { Component } from 'react';
class App extends Component {
  num = 100
  // 类的构造函数,它只执行1次,在初始化
  // constructor(props) {
  //   super(props);
  //   // 在构建函数中统一的把事件方法this绑定好
  //   this.addNum = this.addNum.bind(this)
  // }
  // 在react事件绑定的类组件中,默认情况this指向会可能存在指向问题  undefined
  // 在绑定事件中绑定this调用函数时的写法
  addNum(n = 1) {
    this.num += n
    this.forceUpdate()
  }
  // 构造函数中绑定this调用函数时的写法,因为不传值第一个参数会
  // addNum(evt, n = 1) {
  //   this.num += n
  //   this.forceUpdate()
  // }
  render() {
    return (
      <div>
        <h3>{this.num}</h3>
        {/* 在此处可以使用bind来绑定this指向(this指向 App 实例),且还可以传参数 */}
        {/* 此方案在使用中,较多 */}
        {/* <button onClick={this.addNum.bind(this)}>累加</button> */}
        <button onClick={this.addNum.bind(this, 2)}>累加</button>
        {/* 如果你这样写,又想this指向对,则一定要在构造函数中,解决好this指向 */}
        {/* <button onClick={this.addNum}>累加</button> */}
      </div>
    );
  }
}
export default App;

到此这篇关于React事件处理超详细介绍的文章就介绍到这了,更多相关React事件处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • webpack 2的react开发配置实例代码

    webpack 2的react开发配置实例代码

    本篇文章主要介绍了webpack 2的react开发配置实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 一文搞懂 React 18 中的 useTransition() 与 useDeferredValue()

    一文搞懂 React 18 中的 useTransition() 与 useDeferredValue()

    这篇文章主要介绍了一文搞懂 React 18 中的 useTransition()与useDeferredValue(),文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • react为什么不推荐使用index作为key

    react为什么不推荐使用index作为key

    本文主要介绍了react为什么不推荐使用index作为key,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • react如何实现一个密码强度检测器详解

    react如何实现一个密码强度检测器详解

    这篇文章主要给大家介绍了关于react如何实现一个密码强度检测器的相关资料,使用这个密码强度器后可以帮助大家提高在线帐号、个人信息的安全性,需要的朋友可以参考下
    2021-06-06
  • React实现监听粘贴事件并获取粘贴板中的截图

    React实现监听粘贴事件并获取粘贴板中的截图

    这篇文章主要介绍了React实现监听粘贴事件并获取粘贴板中的截图方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • React教程之Props验证的具体用法(Props Validation)

    React教程之Props验证的具体用法(Props Validation)

    这篇文章主要介绍了React教程之Props验证的具体用法(Props Validation),非常具有实用价值,需要的朋友可以参考下
    2017-09-09
  • 详解如何封装和使用一个React鉴权组件

    详解如何封装和使用一个React鉴权组件

    JavaScript 和 React 提供了灵活的事件处理机制,特别是通过利用事件的捕获阶段来阻止事件传播可以实现精细的权限控制,本文将详细介绍这一技术的应用,并通过实践案例展示如何封装和使用一个 React 鉴权组件,需要的可以参考下
    2024-03-03
  • react-router v6实现权限管理+自动替换页面标题的案例

    react-router v6实现权限管理+自动替换页面标题的案例

    这篇文章主要介绍了react-router v6实现权限管理+自动替换页面标题,这次项目是有三种权限,分别是用户,商家以及管理员,这次写的权限管理是高级权限能访问低级权限的所有页面,但是低级权限不能访问高级权限的页面,需要的朋友可以参考下
    2023-05-05
  • 浅谈React中组件逻辑复用的那些事儿

    浅谈React中组件逻辑复用的那些事儿

    这篇文章主要介绍了浅谈React中组件逻辑复用的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 关于React动态修改元素样式的三种方式

    关于React动态修改元素样式的三种方式

    这篇文章主要介绍了关于React动态修改元素样式的三种方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08

最新评论