返回顶部
首页 > 资讯 > 前端开发 > JavaScript >React的事件处理你了解吗
  • 636
分享到

React的事件处理你了解吗

2024-04-02 19:04:59 636人浏览 安东尼
摘要

目录一、React的事件处理1、与DOM事件处理的不同之处(1)React事件的命名方式:小驼峰方式,DOM的命名方式是小写(2)事件处理函数是以对象的方式赋值,而不是以字符串的方式

一、React的事件处理

1、与DOM事件处理的不同之处

(1)React事件的命名方式:小驼峰方式,DOM的命名方式是小写

例如:DOM的命名:onclick

React的命名:onClick

(2)事件处理函数是以对象的方式赋值,而不是以字符串的方式赋值

例如:DOM以字符串方式:onclick = "handleClick()"

React以对象方式:onClick = { handleClick }

(3)阻止默认事件的方式不同

DOM通过返回false来阻止: <a href="www.baidu.com" οnclick="javascript:return false;">百度</a>

React需要显式调用e.preventDefault来阻止

2、React中事件处理函数的定义

(1)使用ES6的箭头数

①在render函数中使用箭头函数:

Ⅰ、优点:不用在构造函数中绑定this

Ⅱ、缺点:当函数的逻辑比较复杂时,render就显得臃肿,无法直观的看到组件的UI结构,代码可读性差

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta Http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件处理函数-->在render中使用箭头函数</title>
    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script src="../js/babel.min.js"></script>
</head>
<body>
    <div id="root"></div>
    <script type="text/babel">
        let root = document.getElementById('root');
        //1.创建一个类组件
        class MyComponent extends React.Component{
            constructor(props){
                super(props)
                this.state={
                    msg: '小森同学'
                }
            }
            render(){
                return (
                    <div>
                        <button onClick= { ()=>{ console.log(this.state.msg)} } >点我</button>
                    </div>
                )
            }
        }
        //2.进行渲染
        ReactDOM.render(<MyComponent/>,root)
    </script>
</body>
</html>

②使用class fields语法:将箭头函数赋给类的属性

Ⅰ、优点:不用在构造函数中绑定this,在render函数中调用简单

<body>
    <div id="root"></div>
    <script type="text/babel">
        let root = document.getElementById('root');
        //1.创建一个类组件
        class MyComponent extends React.Component{
            constructor(props){
                super(props)
                this.state={
                    msg: '小沈同学',
                    number: 0
                }
            }
            handleClick = ()=>{  //将箭头函数赋给类的属性
                console.log(this.state.msg)  //将一个箭头函数赋值为handleClick,handleClick是MyComponent的一个属性
            }
            render(){
                console.log('render')
                return (
                    <div>
                        <button onClick= { this.handleClick } >点我</button>  //调用这个属性
                    </div>
                )
            }
        }
        //2.进行渲染
        ReactDOM.render(<MyComponent/>,root)
    </script>
</body>

(2)在构造函数中进行绑定:将事件处理函数作为类的成员函数

注意:在定义事件处理函数时,是无法识别this(即this是undefined的),必须在构造函数中绑定this

①、优点:在render函数调用时不需要重新创建事件处理函数

②、缺点:当事件处理很多时,构造函数就显的很繁琐

<body>
    <div id="root"></div>
    <script type="text/babel">
        let root = document.getElementById('root');
        //1.创建一个类组件
        class MyComponent extends React.Component{
            constructor(props){
                super(props)
                this.state={
                    msg: '小沈同学',
                    number: 0
                }
                this.add = this.add.bind(this)  //this指针绑定到函数add里面去
            }
            handleClick = ()=>{
                console.log(this.state.msg)
            }
            add(){  //如果上述不绑定this,那么add函数里的this将无法识别
                let num = this.state.number
                num++
                this.setState({
                    number: num
                })
                console.log(this.state.number)
            }
            render(){
                console.log('render')
                return (
                    <div>
                        <button onClick= { this.handleClick } >点我</button>
                        <button onClick= { this.add }>Number++</button>
                    </div>
                )
            }
        }
        //2.进行渲染
        ReactDOM.render(<MyComponent/>,root)
    </script>
</body>

(3)在render函数中绑定this

①、优点:在调用事件处理函数时,传参比较方便

②、缺点:每次调用render函数时都重新绑定,导致性能下降

<body>
    <div id="root"></div>
    <script type="text/babel">
        let root = document.getElementById('root');
        //1.创建一个类组件
        class MyComponent extends React.Component{
            constructor(props){
                super(props)
                this.state={
                    msg: '小沈同学',
                    number: 0
                }
                // this.add = this.add.bind(this)  //this指针绑定到函数add里面去
            }
            handleClick = ()=>{
                console.log(this.state.msg)
            }
            add(){  //如果上述不绑定this,那么add函数里的this将无法识别
                let num = this.state.number
                num++
                this.setState({
                    number: num
                })
                console.log(this.state.number)
            }
            render(){
                console.log('render')
                return (
                    <div>
                        <button onClick= { this.handleClick } >点我</button>
                        <button onClick= { this.add.bind(this) }>Number++</button>
                    </div>
                )
            }
        }
        //2.进行渲染
        ReactDOM.render(<MyComponent/>,root)
    </script>
</body>

(4)React中事件处理函数

几种方式的比较

影响constructor函数中bind使用class fields语法render中使用箭头函数render中使用bindrender时生成新函数否否是是性能无影响无影响有影响有影响可直接携带参数否否是是简洁性不好好好好

(5)注意事项

①React事件的命名采用小驼峰式(camelCase),而不是纯小写。且事件名称之后不能加(),否则会直接执行

②不能通过返回false的方式阻止默认行为,必须显示的使用preventDefault

③必须谨慎对待JXS回调函数中的this,在JavaScript中,class(类)的方法默认不会绑定this。如果忘记绑定this.textChange并把它传入onChange,当调用这个函数的时候,this的值为undefined。如果觉得使用bind麻烦,还可以使用箭头函数。

3、事件处理中的参数传递

(1)直接传递参数

①在构造函数中给事件处理函数绑定this,调用事件处理函数时直接传参

 <div id="root"></div>
    <script type="text/babel">
        let root = document.getElementById('root');
        //1.定义类组件
        class Clock extends React.Component{
            constructor(props){
                super(props)
                this.state= {
                    list:[
                        {
                            id: 111,
                            msg: '小森'
                        },
                        {
                            id: 222,
                            msg: '小沈'
                        },
                        {
                            id: 333,
                            msg: '小顾'
                        }
                    ],
                    msg: '编号:'
                }
                this.handleClick = this.handleClick.bind(this)
            }
            handleClick(id){ //事件处理函数
                alert("编号:"+id)
            }
            render(){
                //获取状态属性值
                const { list } = this.state 
                return (
                    <div>
                        {
                            list.map((item)=>
                               <button onClick={ ()=>{this.handleClick(item.id)}} key={item.id}>{item.msg}</button> 
                            )
                        }
                    </div>
                )
            }
        }
        //2.渲染
        ReactDOM.render(<Clock/>,root)
    </script>

注意:在箭头函数中调用事件处理函数时不需要绑定this

②在render函数中调用事件处理函数时进行this的绑定

<div id="root"></div>
    <script type="text/babel">
        let root = document.getElementById('root');
        //1.定义类组件
        class Clock extends React.Component{
            constructor(props){
                super(props)
                this.state= {
                    list:[
                        {
                            id: 111,
                            msg: '小森'
                        },
                        {
                            id: 222,
                            msg: '小沈'
                        },
                        {
                            id: 333,
                            msg: '小顾'
                        }
                    ],
                    msg: '编号:'
                }
            }
            handleClick(id){ //事件处理函数,e表示触发事件的对象,成员函数
                let str = this.state.msg
                alert(str + id)
            }
            render(){
                //获取状态属性值
                const { list } = this.state 
                return (
                    <div>
                        {
                            list.map((item)=>
                                <button onClick={ this.handleClick.bind(this,item.id) } key={item.id}>{ item.msg }</button>
                            )
                        }
                    </div>
                )
            }
        }
        //2.渲染
        ReactDOM.render(<Clock/>,root)
    </script>

(2)在定义UI控件时使用data自定义属性,在事件处理函数中通过'e.target.dataset.属性名'来获取UI控件中的data属性值

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件处理中的参数传递</title>
    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script src="../js/babel.min.js"></script>
</head>
<body>
    <div id="root"></div>
    <script type="text/babel">
        let root = document.getElementById('root');
        //1.定义类组件
        class Clock extends React.Component{
            constructor(props){
                super(props)
                this.state= {
                    list:[
                        {
                            id: 111,
                            msg: '小森'
                        },
                        {
                            id: 222,
                            msg: '小沈'
                        },
                        {
                            id: 333,
                            msg: '小顾'
                        }
                    ],
                    msg: '编号:'
                }
            }
            handleClick(e){ //事件处理函数,e表示触发事件的对象
                let str = this.state.msg
                alert(str + e.target.dataset.count)
                    //事件处理对象event,通过event可以得到target目标对象,就是那个button。dataset,得到自定义属性的集合,在集合里找到count
            }
            render(){
                //获取状态属性值
                const { list } = this.state 
                return (
                    <div>
                        {
                            list.map((item)=>
                                  <button 
                                     onClick={ this.handleClick.bind(this) } 
                                     key={item.id}
                                     data-count = { item.id}  //标签的自定义属性用'data-'开头后跟自定义属性名
                                    >{ item.msg }</button>
                            )
                        }
                    </div>
                )
            }
        }
        //2.渲染
        ReactDOM.render(<Clock/>,root)
    </script>
</body>
</html>

4、事件流

(1)React的事件流默认是冒泡

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件流</title>
    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script src="../js/babel.min.js"></script>
</head>
<body>
    <div id="root"></div>
    <script type="text/babel">
        let root = document.getElementById('root')
        //1.定义CSS样式
        const style = {
            child: {
                width: '100px',
                height: '100px',
                backgroundColor: 'red'
            },
            parent: {
                width: '150px',
                height: '150px',
                backgroundColor: 'blue'
            },
            ancestor: {
                width: '200px',
                height: '200px',
                backgroundColor: 'green'
            }
        }
        //2.定义类组件
        class App extends React.Component{
            render(){
                return (
                    <div
                        onClick= { ()=>{ console.log('ancestor')}}
                        style = { style.ancestor }
                    >
                        <div
                           onClick={ ()=>{ console.log('parent')}}
                           style = { style.parent }
                        >
                            <div 
                               onClick={ (e)=>{ 
                                   console.log('child')
                                   e.stopPropagation() //阻止冒泡
                                }}
                               style = {style.child }
                            >
                            </div>
                        </div>
                    </div>
                )
            }
        }
        //3.渲染
        ReactDOM.render(<App/>,root)
    </script>
</body>
</html>
//输出child,parent,ancestor

(2)React中使用捕获方式:事件类型后面加一个后缀Capture

先由document找到最外层绿色的,然后传给蓝色,然后传给红色。所以工具中输出的顺序是(ancestor,parent,child)

5、事件对象

虽然React事件是合成事件,但是在事件处理中可以获取事件对象的

(1)在React事件处理中有一个全局事件对象

event对象,每次事件触发后(事件处理函数调用完成后),就会清空event对象当下一次事件触发时重新获取该对象。该对象不是原生(DOM)的event对象,但是可以通过该对象获取原生对象的部分属性

<div id="root"></div>
    <script type="text/babel">
        let root = document.getElementById('root')
        //1.定义样式规则
        const style = {
            "mydiv": {
                width: '150px',
                height: '150px',
                backgroundColor: 'red'
            }
        }
        //2.定义类组件
        class App extends React.Component{
            constructor(props){
                super(props)
                this.state = {
                    x: 0,
                    y: 0
                }
            }
            render(){
                return (
                    <div>
                        <div style = { style['mydiv']}  //以数组的方式设置样式
                             onClick= { (event)=> { //'event'对象不是原生的event,但是可以通过event来获取原生的事件对象的部分属性
                                const { clientX,clientY } = event
                                 this.setState({
                                     x: event.clientX,
                                     y: event.clientY
                                 })
                        >
                          X: {this.state.x},Y: { this.state.y }
                        </div>
                    </div>
                )
            }
        }
        //3.渲染
        ReactDOM.render(<App />,root)
    </script>

(2)在异步操作中获取event

 问题:当事件触发、响应结束后,event对象会被清空,但是异步数据还没有得到,在得到异步数据之后再去访问 event对象的属性就会报错。

解决办法:先将event对象的某些属性值保存起来,得到异步数据之后再来使用这些属性值

<div id="root"></div>
    <script type="text/babel">
        let root = document.getElementById('root')
        //1.定义样式规则
        const style = {
            "mydiv": {
                width: '150px',
                height: '150px',
                backgroundColor: 'red'
            }
        }
        //2.定义类组件
        class App extends React.Component{
            constructor(props){
                super(props)
                this.state = {
                    x: 0,
                    y: 0
                }
            }
            render(){
                return (
                    <div>
                        <div style = { style['mydiv']}  //以数组的方式设置样式
                             onClick= { (event)=> { //'event'对象不是原生的event,但是可以通过event来获取原生的事件对象的部分属性
                                const { clientX,clientY } = event //定义变量,将event保存起来
                                setTimeout(()=>{  //下次触发时就可以得到保存在变量中的值
                                    this.setState({
                                        x: clientX,
                                        y: clientY
                                    })
                                },1000)
                             }}
                        >
                          X: {this.state.x},Y: { this.state.y }
                        </div>
                    </div>
                )
            }
        }
        //3.渲染
        ReactDOM.render(<App />,root)
    </script>

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容! 

--结束END--

本文标题: React的事件处理你了解吗

本文链接: https://lsjlt.com/news/141782.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • React的事件处理你了解吗
    目录一、React的事件处理1、与DOM事件处理的不同之处(1)React事件的命名方式:小驼峰方式,DOM的命名方式是小写(2)事件处理函数是以对象的方式赋值,而不是以字符串的方式...
    99+
    2024-04-02
  • JavaScript的事件流你了解吗
    目录1. 什么是事件流?2. 事件流模型2.1)事件冒泡2.2)事件捕获3. DOM事件流总结1. 什么是事件流 ? 在学习事件流之前我们先看...
    99+
    2024-04-02
  • JavaScript的事件监听你了解吗
    目录1. 什么是事件监听?2. DOM0级事件监听2.1)常见的页面事件监听2.2)常见的鼠标事件监听2.3)常见的键盘事件监听2.4)常见的表单事件监听3.&e...
    99+
    2024-04-02
  • Spring的事务管理你了解吗
    目录1、事务介绍2、事务的四个特性(ACID)3、Spring 事务管理的核心接口4、PlatformTransactionManager 事务管理器5、TransactionSta...
    99+
    2024-04-02
  • react中的axios模块你了解吗
    目录一、react中axios模块的使用1、基于Promise的HTTP库用在浏览器和node.js中2、创建XMLHttpRequest对象:3、在react中安装axios4、发...
    99+
    2024-04-02
  • React中的Diff算法你了解吗
    目录一、Diff算法的作用二、React的Diff算法  1、什么是调和?2、什么是React diff算法?3、diff策略4、tree diff:5、comp...
    99+
    2024-04-02
  • 你了解Redis事务吗
    目录前言ACID属性说明原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)Redis如何实现事务实现原理事务相关命...
    99+
    2022-11-13
    Redis 事务
  • Vue全局事件总线你了解吗
    全局事件总线,是组件间的一种通信方式,适用于任何组件间通信。 看下面具体的例子。 父组件:App <template> <div class="app"&g...
    99+
    2024-04-02
  • React中的Refs属性你来了解吗
    目录1 介绍2 使用方法2.1 createRef(版本>=React16.3)2.2 回调Refs2.3 String类型的Refs(已过时,不推荐使用)2.4 useRef...
    99+
    2024-04-02
  • React事件处理和表单的绑定详解
    目录一、事件处理1.1 React事件1.2 事件对象1.3 事件传参1.4 函数组件事件处理二、表单一、事件处理 1.1 React事件 React 元素的事件处理和 DOM 元素...
    99+
    2024-04-02
  • React事件处理的示例分析
    小编给大家分享一下React事件处理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!React的事件处理和DOM的事件处...
    99+
    2024-04-02
  • react中的双向绑定你真的了解吗
    前言:因为项目原因需要学习另一个超级火的框架react, 因为之前一直使用vue进行开发,所以在学习react中会不自觉的代入一些vue中的概念来理解react中的实现,下面就通过对...
    99+
    2024-04-02
  • Vue 事件中的 .native你搞明白了吗
    native是什么? .native - 监听组件根元素的原生事件。主要是给自定义的组件添加原生事件。 官网的解释: 你可能想在某个组件的根元素上监听一个原生事件。可以使用 v-on...
    99+
    2023-02-02
    vue 事件.native vue 事件中的 .native
  • 你理解MySQL中的事务吗
    本文主要给大家介绍MySQL中的事务,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下MySQL中的事务吧。一个示例:银行引用是事务的一个经典例子:假如...
    99+
    2024-04-02
  • React事件处理超详细介绍
    目录1. 事件绑定1.1 函数组件1.2 类组件2. 合成事件3. 事件传参的3种不同写法4. this 指向问题1. 事件绑定 React 元素的事件处理和 DOM 元素的很相似,...
    99+
    2024-04-02
  • Python 分布式框架在文件处理中的应用,你了解吗?
    在现代大数据时代,数据量已经不再是一个局限。当我们需要进行大规模数据处理时,单机的计算资源已经无法满足我们的需求。这时候,分布式系统就成为了我们的选择。Python 作为一门高效的编程语言,也提供了很多分布式框架,比如 PySpark、D...
    99+
    2023-10-14
    分布式 框架 文件
  • react合成事件与原生事件的相关理解
    目录1. 原生事件 2. 合成事件 为什么react事件需要手动绑定this3. 原生与合成事件触发顺序4. 合成事件和原生事件混用 相关疑问:e.nativeEvent.stopP...
    99+
    2024-04-02
  • 带你了解NodeJS事件循环
    浏览器中存在两个任务队列,一个是宏任务一个是微任务。但是在NodeJS中一共存在六个事件队列,timers,pending callbacks,idle prepare,poll,...
    99+
    2024-04-02
  • React合成事件原理解析
    目录事件介绍什么是事件?举个栗子代码实现React合成事件基础知识什么是合成事件?在React中事件的写法和原生事件写法的区别?为什么会有合成事件?合成事件机制简述React合成事件...
    99+
    2024-04-02
  • PHP 在大数据处理中的应用:你了解吗?
    随着互联网的普及和大数据时代的到来,数据处理成为了各行各业的必需品。而 PHP 作为一种流行的服务器端脚本语言,其在大数据处理中也有着广泛的应用。本文将介绍 PHP 在大数据处理中的应用以及一些相关的代码演示。 一、PHP 与大数据 PH...
    99+
    2023-10-02
    关键字 大数据 shell
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作