React中事件的类型定义方式

 更新时间:2022年12月02日 10:17:02   作者:Pandy : )  
这篇文章主要介绍了React中事件的类型定义方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

React事件的类型定义

基本的事件类型

React 搞了一套自己的事件类型,所以你没办法使用 TypeScript 内置提供的 MouseEvent 等等。在需要定义事件类型的时候,需要从 React 中导入:

import React, { Component, MouseEvent } from 'react';

export class Button extends Component {
  handleClick(event: MouseEvent) {
    event.preventDefault();
    alert(event.currentTarget.tagName); // alerts BUTTON
  }
  
  render() {
    return (
    <button onClick={this.handleClick}>
      {this.props.children}
    </button>
    );
  }
}

React 提供的事件类型有:

  • AnimationEvent 
  • ChangeEvent 
  • ClipboardEvent 
  • CompositionEvent 
  • DragEvent 
  • FocusEvent 
  • FormEvent 
  • KeyboardEvent 
  • MouseEvent 
  • PointerEvent 
  • TouchEvent 
  • TransitionEvent 
  • WheelEvent

还有一个 SyntheticEvent,用于其他所有的事件。

限制性的事件类型

如果需要限制事件类型,可以利用事件类型的泛型:

import React, { Component, MouseEvent } from 'react';

export class Button extends Component {
  /*
   * 这里我们将 handleClick 限制只能是在 HTMLButton 元素上
   */
  handleClick(event: MouseEvent<HTMLButtonElement>) {
    event.preventDefault();
    alert(event.currentTarget.tagName); // alerts BUTTON
  }

  /* 
   * 支持联合类型
   */
  handleAnotherClick(event: MouseEvent<HTMLButtonElement | HTMLAnchorElement>) {
    event.preventDefault();
    alert('Yeah!');
  }

  render() {
    return <button onClick={this.handleClick}>
      {this.props.children}
    </button>
  }
}

这里的限定的类型是 TypeScript 提供的 DOM 元素类型。

React四种定义事件方式

事件本身处的位置是一个属性 如果属性的值是一个函数

使用{}包裹,一定要保证该函数内的this指向

import React, { Component } from 'react';
export default class App extends Component {
    constructor(props) {
        super(props);
        this.add1000Fn = this.add1000.bind(this)
    }
    state = {
        count:1
    }
    add10 = () => {
        this.setState({count:this.state.count + 10})
    }
    add100 = function() { // 一般写为 add100 () {} 二者是等价的
        console.log(this);
        this.setState({count:this.state.count + 100})
    }
    add1000() {
        this.setState({count:this.state.count + 1000})
    }
    render() {
        return (
            <>
               <div>count:{ this.state.count}</div>
               {/* 1.事件定义方式1:直接在render里写行内的箭头函数  */}
               <button onClick={ ()=>{
                   //如果该函数使用声明式 function(){} 内部的this指向为undefined
                    this.setState({count:++this.state.count})
               }}>加一</button>
 
               {/* 2.事件定义方式2:在组件内使用箭头函数定义的一个方法 */}
               <button onClick={this.add10}>加十</button>
 
               {/* 3.事件定义方式3:直接在组件内定义一个非箭头函数的方法,然后在render里直接使用`onClick={this.handleClick.bind(this)}` */}
               <button onClick={ this.add100.bind(this)}>加一百</button>
 
                {/* 4.事件定义方式4: 直接在组件内定义一个非箭头函数的方法,然后在constructor里bind(this)*/}
                <button onClick = { this.add1000Fn }>加1000</button>
            </>
        );
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • react:swr接口缓存案例代码

    react:swr接口缓存案例代码

    useSWR 是一个 React Hooks,是 HTTP 缓存库 SWR 的核心方法之一,SWR 是一个轻量级的 React Hooks 库,通过自动缓存数据来实现 React 的数据获取,本文给大家介绍react:swr接口缓存案例详解,感兴趣的朋友一起看看吧
    2023-11-11
  • 使用useMutation和React Query发布数据demo

    使用useMutation和React Query发布数据demo

    这篇文章主要为大家介绍了使用useMutation和React Query发布数据demo,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • react-router-dom的使用说明

    react-router-dom的使用说明

    这篇文章主要介绍了react-router-dom的使用说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 在React中实现分块导出大量数据表格并压缩成图片的解决方案

    在React中实现分块导出大量数据表格并压缩成图片的解决方案

    在现代Web开发中,处理和展示大量数据是一个常见的挑战,特别是在使用React框架时,我们经常需要将这些数据以表格的形式展示,并提供导出功能,本文将介绍如何在React中实现一个高效、分块导出大量数据表格,并将其压缩为图片的解决方案,需要的朋友可以参考下
    2024-12-12
  • React配置多个代理实现数据请求返回问题

    React配置多个代理实现数据请求返回问题

    这篇文章主要介绍了React之配置多个代理实现数据请求返回问题,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 谈谈React中的Render Props模式

    谈谈React中的Render Props模式

    这篇文章主要介绍了谈谈React中的Render Props模式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 可定制React自动完成搜索组件Turnstone实现示例

    可定制React自动完成搜索组件Turnstone实现示例

    这篇文章主要为大家介绍了可定制React自动完成搜索组件Turnstone实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • vite+react+tailwindcss的简单使用方式

    vite+react+tailwindcss的简单使用方式

    这篇文章主要介绍了vite+react+tailwindcss的简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 关于React动态加载路由处理的相关问题

    关于React动态加载路由处理的相关问题

    这篇文章主要介绍了关于React动态加载路由处理的相关问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • React避免子组件无效刷新的三种解决方案

    React避免子组件无效刷新的三种解决方案

    这篇文章主要给大家介绍了React三种避免子组件无效刷新的解决方案,使用React.memo,使用React.useMemo或React.useCallback,将子组件作为children来传递这三种方案,文章通过代码介绍的非常详细,需要的朋友可以参考下
    2023-08-08

最新评论