react——事件绑定

这篇具有很好参考价值的文章主要介绍了react——事件绑定。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        react有两种写法,一种是类组件,也叫有状态组件;一种是函数式组件,也叫无状态组件,而后引入了react hooks,函数式组件也能修改状态。在这两种组件中的事件绑定的原理一样,写法不一样。这篇文章主要就是记录这两种组件中的事件绑定写法。

react——事件绑定

 

一、前提说明

        重点是记录两种组件中事件绑定使用的区别,避免下次使用的时候还犯迷糊,在下面的写法中,可能出现同一类组件中多种写法,只要自己选择自己喜欢的那种写就可以了,没必要每种都要会,能看的懂就可以。想直接拿来用的,可以直接跳过原理,看使用案例,对原理感兴趣的可以回头来看看事件原理。在react中,事件的写法都是on+事件类型(第一个字母大写),如点击事件(onClick),鼠标事件(onMouseOver ,onMouseOut)

二、事件绑定的原理

        react中的事件都是合成事件,react并不是将click事件绑定到了div的真实DOM上,而是在document处监听了所有的事件,当事件发生并且冒泡到document处的时候,React将事件内容封装并交由真正的处理函数运行。这样的方式不仅仅减少了内存的消耗,还能在组件挂在销毁时统一订阅和移除事件。

        另外冒泡到document上的事件也不是原生的浏览器事件,而是由react自己实现的合成事件(SyntheticEvent)。因此我们如果不想要是事件冒泡的话调用event.stopProppagation()方法是无效的。而应该调用event.preventDefault()。

(一)事件注册

        组件更新或者装载时,在给dom增加合成事件时,需要将增加的target传入到document进行判断,给document注册原生事件回调为dispatchEvent(统一的事件分发机制)。

(二)事件存储

        EventPluginHub负责管理React合成事件的callback,它将callback存储到listennerBank中,另外还存储了负责合成事件的Plugin,Event存储到listennerbank中,每一个元素在listennerBank中会有唯一的key。

(三)事件触发执行

        点击时冒泡到docunment中,触发注册原生事件的回调dispatchEvent,获取到触发这个事件的最深层元素,事件执行利用react的批处理机制。

(四)合成事件

        循环所有类型的eventPlugin,对应每个事件类型,生成不同的事件池,如果是空,则生成新的,有则用之前的,根据唯一key获取到指定的回调函数,再返回带有参数的回调函数。

(五)总流程

 -- >  组件装载/更新

 -- >  新增/删除事件

 -- >  eventplugin添加到ListennerBank中监听事件

 -- >  触发事件

 -- >  生成合成事件

 -- >  通过唯一key获取到指定函数

 -->   执行指定回调函数

 -- >  执行完毕后释放

三、事件使用案例

(一)类组件的事件绑定

import React, { Component } from 'react'

export default class App1 extends Component {
    test2Fn() {
        console.log('test2');
    }
    test3Fn = () => {
        console.log('test3');
    }
    test4Fn = () => {
        console.log('test4');
    }
    render() {
        return (
            <div>
                {/* 直接写箭头函数,因为普通函数有this指向问题 */}
                <button onClick={() => { console.log('test1'); }}>第一种</button>
                {/* this.test2Fn()会被直接调用 和 this.test2Fn不一样*/}
                <button onClick={this.test2Fn}>第二种</button>
                <button onClick={this.test3Fn}>第三种</button>
                <button onClick={() => {
                    this.test4Fn()
                }}>第四种</button>

            </div>
        )
    }
}

react——事件绑定

个人比较喜欢第三种写法

第一种写法有弊端,逻辑长的时候不方便观看,也不建写在dom里面

第二种有this指向问题,如定义一个a=100,在方法二中通过this.a获取会报错,这是因为this没有指向App1实例中

react——事件绑定

 通过this.test2Fn.bind(this)可以解决,这样可以使两个this指向一致

import React, { Component } from 'react'

export default class App1 extends Component {
    a=100  //添加一个全局变量
    test2Fn() {
        console.log('test2',this.a);
    }
    test3Fn = () => {
        console.log('test3',this.a);
    }
    test4Fn = () => {
        console.log('test4',this.a);
    }
    render() {
        return (
            <div>
                {/* 直接写箭头函数,因为普通函数有this指向问题 */}
                <button onClick={() => { console.log('test1',this.a); }}>第一种</button>
                {/* this.test2Fn()会被直接调用 和 this.test2Fn不一样*/}
                <button onClick={this.test2Fn.bind(this)}>第二种</button>
                <button onClick={this.test3Fn}>第三种</button>
                <button onClick={() => {
                    this.test4Fn()
                }}>第四种</button>

            </div>
        )
    }
}

this指向修改

call:    修改this指向,并使函数自动执行(不用函数()调用)

apply: 修改this指向,并使函数自动执行(不用函数()调用)

bind:   修改this指向,需要手动执行(用()调用)

(二)函数式组件的事件绑定

function App2(){
    const test=()=>{
        console.log("add");
    }
    return(
        <div >
            <button onClick={test}>add</button>
        </div>
    )
}
export default App2

react——事件绑定文章来源地址https://www.toymoban.com/news/detail-426196.html

到了这里,关于react——事件绑定的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • react class组件写法

    当使用 React 的 Class 组件时,可以按照以下方式编写: import React, { Component } from \\\'react\\\'; class MyClassComponent extends Component {   constructor(props) {     super(props);     // 在构造函数中初始化状态(state)或绑定方法     this.state = {       // 初始化状态       counter: 0     };    

    2024年02月11日
    浏览(40)
  • react 事件函数中 this 绑定问题

    在使用类方式创建组件时,类中定义一个函数,并且绑定到元素的点击事件上,此时这个函数中this指向并不是当前这个组件。 组件代码如下: 如上代码中,点击修改文本按钮,会发生如下报错 Uncaught TypeError: Cannot read properties of undefined (reading \\\'setState\\\') 提示 undefined 找不到

    2024年02月03日
    浏览(40)
  • 【vue3 之 emits & $emit() 讲解 】监听子组件事件、emit事件验证、options写法、composition setup写法

    前言:不懂在父组件里对子组件 @xxxx 声明自定义事件,就不用看本篇文章了。本篇对此内容不做任何说明。这是与 emits 结合使用的必备知识! 场景说明: 组件功能封装:         组件封装了一系列 emit 事件,并返回数据、回调函数等,或单纯执行某个操作后,触发父组

    2023年04月09日
    浏览(55)
  • Vue2:给组件绑定自定义事件

    我们在页面开发中,难免要使用事件。 在之前的学习中,我们学过 @click、@keyup、@change 等事件,这些是 Vue 自带的事件。 它一般是用在原生的HTML元素上的。在组件上使用需要加 native 修饰 比如: 这一篇说的自定义事件,可以绑定到我们自己的 Vue 组件上。 实现 子组件给父组

    2024年01月19日
    浏览(55)
  • react和vue2/3父子组件的双向绑定

    目录 Vue3 父子传值:props(attrs)/emit 父传子 props 父child :属性名=\\\"变量\\\" 子props=defineProps({属性名:type...}) attrs父作用域(除 class、 style 、 props )属性集合 父child :属性名=\\\"变量\\\",属性名=\\\"常量\\\" 子 attrs = useAttrs() 子传父emits+@=v-on: 父child @事件名\\\"=\\\"parentClick\\\",parentClick(msg) 子emi

    2024年02月16日
    浏览(45)
  • Vue.js核心概念简介:组件、数据绑定、指令和事件处理

    本文介绍了Vue.js的四个核心概念:组件、数据绑定、指令和事件处理。每个概念都通过一个简单的示例进行了详细的解释。通过学习这些概念,您将能够充分利用Vue.js的强大功能,构建高效、灵活的Web应用程序。 1 组件 组件是Vue.js的核心概念之一,它允许您将UI分解为相互作

    2024年02月04日
    浏览(59)
  • uniapp框架组件、props对组件传值、对组件绑定事件的使用、子组件给父组件传值

    新建组件的方式,在components目录下新建组件,然后就能在pages页面当中直接使用该组件 test.vue home.vue: 页面效果如下: props的作用就是可以从外部的标签当中传值到标签当中的内容 props的使用方法:在子组件当中,props是一个对象,对象当中的数据也是一个对象,该有两个属性

    2024年02月15日
    浏览(44)
  • 在uniapp中为自定义组件绑定点击事件点击后没有效果

    使用uniapp时,封装了一个Card的组件,为这个Card组件加上点击事件 @click=\\\"handleClick\\\"事件时,事件没有触发。 点开微信小程序生成后的源码,可以看到 @click的事件 变成bindClick 了。正确的点击事件应该是 bindtap ,如下图中view上面绑定事件。 这个时候可以修改组件上面的写法,

    2024年02月07日
    浏览(43)
  • React从入门到实战-事件处理,受控组件与非受控组件

    事件处理 通过onXxx属性指定事件处理函数(注意大小写) React使用的是自定义(合成)事件,而不是使用的原生DOM事件——为了更好的兼容性 React中的事件是通过事件委托方式处理的(委托给组件最外层的元素——为了更高效 通过event.target得到发生事件的DOM元素对象 收集表

    2024年02月12日
    浏览(174)
  • 快速上手React:从概述到组件与事件处理

    「作者主页」 :雪碧有白泡泡 「个人网站」 :雪碧的个人网站 「推荐专栏」 : ★ java一站式服务 ★ ★ React从入门到精通 ★ ★ 前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升 ★ ★ 从0到英雄,vue成神之路 ★ ★ 解决算法,一个专栏就够了 ★ ★

    2024年02月13日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包