步入React正殿 - 事件处理

目录

扩展学习资料

React事件和DOM事件

 和传统DOM事件处理异同

this关键字的处理

this关键字

在JSX中使用bind方法

在构造函数中使用bind方法

使用箭头函数【推荐】

向事件处理程序传递参数【不跨组件】

向父组件传递参数

@/src/App.js

@/src/components/listItem.jsx

React事件机制

DOM事件

React事件

React事件要素

小结

练习


扩展学习资料

预习资料名称

链接

备注

源码分析事件

React源码分析6 — React合成事件系统 - 知乎

扩展阅读

合成事件

http://react.html.cn/docs/events.html

React事件和DOM事件

import React, { Component } from 'react';
import style from './listitem.module.css';
import classnames from 'classnames/bind';
const cls = classnames.bind(style);
let count = 0;
class ListItem extends Component {// 类的构造函数// eslint-disable-next-line no-useless-constructorconstructor(props) {// JS规定,子类的构造函数必须先调用一下super函数// =>类似于call的继承:在这里super相当于把Component的constructor给执行了,// 并且让方法中的this是ListItem的实例,// super当中传递的实参都是在给Component的constructor传递。super(props);// super 除了在 constructor 里直接调用外还可以使用 super.xxx(…) // 来调用父类上的某个原型方法,这同样是一种限定语法。}handleDecrease(e) {console.log('----', e);}handleAdd() {console.log('++++');}render() {return (<div className='row mb-3'><div className='col-6 themed-grid-col'><span style={{ fontSize: 22, color: '#710000' }}>{this.props.data.name}</span></div><div className='col-1 themed-grid-col'><span className={cls('price-tag')}>¥{this.props.data.price}</span></div>{/* <div className={"col-2 themed-grid-col" + ( count ? '' : '-s') } >
{this.manageCount()}</div> */}<div className={`col-2 themed-grid-col${count ? '' : '-s'}`}><buttononClick={this.handleDecrease}type='button'className='btn btn-primary'>-</button><span className={cls('digital')}>{this.manageCount()}</span><buttononClick={this.handleAdd}type='button'className='btn btn-primary'>+</button></div></div>);}manageCount() {return count ? count + '个' : count;}
}
export default ListItem;

 和传统DOM事件处理异同

this关键字的处理

this关键字

  • 在JSX中使用bind方法

<button// 这样写在handleDecrease函数中就可以使用this了onClick={this.handleDecrease.bind(this)}type='button'className='btn btn-primary'>-</button>
  • 在构造函数中使用bind方法

constructor(props) {super(props);// 这样写在handleAdd函数中就可以使用this了this.handleAdd = this.handleAdd.bind(this);}
  • 使用箭头函数【推荐】

// 这样写在handleAdd函数中就可以使用this了
handleAdd = () => {count++;console.log('++++', this);
};

向事件处理程序传递参数【不跨组件】

方法一

onClick={this.handleDecrease.bind(this, 9)}
const count = 0;
doSomethingWithCount() {if (count < 0) count = 0;
}
handleDecrease(id, event) {console.log('----id:', id, this, event);count--;this.doSomethingWithCount();
}

方法二【推荐】

<buttononClick={(event) => {this.handleDecrease(9, event);}}type='button'className='btn btn-primary'>-
</button>

向父组件传递参数

@/src/App.js

在父组件定义好事件处理函数,并通过props向子组件传递

//...
class App extends Component {// 1.1定义handleDelete = (id) => {console.log("删除id: ", id);};render() {return (<div className="container">{listData.length === 0 && (<div className="text-center">购物车是空的</div>)}{listData.map((item) => {return (// 1.2传递<ListItem key={item.id} data={item} onDelete={this.handleDelete} />);})}</div>);}
}
//...

@/src/components/listItem.jsx

在子组件react元素上,绑定props传入的函数,并带入参数

// ...
onClick={()=> {this.props.onDelete(this.props.data.id)}}onClick={this.props.onDelete.bind(this,this.props.data.id)}
// ...

React事件机制

DOM事件

【Dom事件的基本模型】事件捕获=>目标对象本身的事件处理=>冒泡

 行为委托:就是把子元素的事件处理委托给父级元素进行处理

React事件

React事件机制抽象图

 

react会把所有的事件绑定到document上面,而不是某一个元素上面,统一的使用事件监听,并在冒泡阶段处理事件,所有当挂载卸载组件的时候,只需要在统一的事件监听位置增加或删除对象,因此会极大的提高效率。

当事件触发的时候,我们的组件会生成一个合成事件,

然后传递到document当中,

document会通过Dispatch Event回调函数依次执行dispatcher中同类型监听函数,

事件注册是在组件生成的时候我们将listen dom中的所有的事件对应的原生事件都注册到document的监听器当中(ListenerBank中)并以key作为索引

好处就是能将可能要触发的事件分门别类

React事件要素

  • React事件是合成事件,不是DOM原生事件
  • 在document监听所有的支持事件
  • 使用统一的分发函数dispatchEvent指定事件的执行

小结

  1. 原生事件差异
  2. 事件处理中this的注意事项
  3. 事件处理如何传递参数
  4. 父子组件间事件参数的传递
  5. React事件机制

练习

【题目1】 使用bind方法和箭头函数传递参数。

【题目2】 描述事件在react中的处理方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1382613.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

微信对接系列——微信自动退款

业务背景 关于微信自动退款串接背景基于酷客多多商户系统&#xff0c;系统组成主要有前端小程序、商家后台管理系统、运营商系统等 业务流程 退款单状态&#xff1a;待退款、退款中、退款完成、自动退款失败等 由于微信申请退款接口接受请求后不会立即进行退款处理&#xf…

基于grpc从零开始搭建一个准生产分布式应用(1) - 开始准备

开始前必读&#xff1a;​​基于grpc从零开始搭建一个准生产分布式应用(0) - quickStart​​ 本来笔者并不想开设这个系列&#xff0c;因为工作量比较大&#xff0c;另外此专题的技术点也偏简单。最近复盘了下最近的工作&#xff0c;发现一个问题就是各个互联网大厂一般都会有…

微信小程序开发(十)小程序支付-查询退款

应用场景 提交退款申请后&#xff0c;通过调用该接口查询退款状态。退款有一定延时&#xff0c;用零钱支付的退款20分钟内到账&#xff0c;银行卡支付的退款3个工作日后重新查询退款状态。 接口说明 这里退款还是根据商户订单号-out_trade_no去微信那边查询 代码实现 /** 根…

微信中的这个功能尽早设置,即使转错账也能及时收回!

生活在快节奏的我们&#xff0c;是离不开互联网的&#xff0c;出门在外&#xff0c;旅行&#xff0c;购物&#xff0c;点餐等等都离不开手机中&#xff0c;手机中最不可能缺少的两款APP就是微信和支付宝&#xff0c;不管是微信&#xff0c;还是支付宝这两款软件在大家心目中是不…

Java - 微信支付

首先贴出官方文档&#xff0c;关于介绍&#xff0c;场景&#xff0c;参数说明&#xff0c;可以直接看文档&#xff1a;https://pay.weixin.qq.com/wiki/doc/api/index.html 一. APP支付 官方文档&#xff1a;https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter9_1…

JAVA微信退款(JSAPI支付)

上一章咱们介绍了微信支付整个流程&#xff0c;这章就趁热打铁地整理下微信退款&#xff08;JSAPI支付&#xff09;相关的知识&#xff0c;为这几章的微信支付画上一个句号把。 前提&#xff1a;从微信公众号那边获取appid&#xff0c;mchid&#xff0c;paternerKey三个参数备…

实例:用C#.NET手把手教你做微信公众号开发(20)--使用微信支付线上收款:jsapi方式

在做线上、线下销售时&#xff0c;可以使用微信便捷支付&#xff0c;通过微信公众号收款有很多种收款方式&#xff0c;如下图&#xff1a; 今天我们来讲一下jsapi支付&#xff0c;场景就是在微信内打开某个页面&#xff0c;完成在线支付&#xff0c;同样一个网页&#xff0c;使…

基于时态差分法的强化学习:Sarsa和Q-learning

时态差分法&#xff08;Temporal Difference, TD&#xff09;是一类在强化学习中广泛应用的算法&#xff0c;用于学习价值函数或策略。Sarsa和Q-learning都是基于时态差分法的重要算法&#xff0c;用于解决马尔可夫决策过程&#xff08;Markov Decision Process, MDP&#xff0…

微信小游戏直播在Android端的跨进程渲染推流实践

本文由微信开发团队工程师“virwu”分享。 1、引言 近期&#xff0c;微信小游戏支持了视频号一键开播&#xff0c;将微信升级到最新版本&#xff0c;打开腾讯系小游戏&#xff08;如跳一跳、欢乐斗地主等&#xff09;&#xff0c;在右上角菜单就可以看到发起直播的按钮一键成…

辞职信微信html,微信退款处理.html

&#xfeff;微信退款处理 $axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; }; $axure.utils.getOtherPath function() { return resources/Other.html; }; $axure.utils.getReloadPath function() { return resources/reload.h…

php微信退款到银行卡,微信支付PHP开发教程七查询退款

重要&#xff1a;本文最后更新于2019-06-07 08:47:57&#xff0c;某些文章具有时效性&#xff0c;若有错误或已失效&#xff0c;请在下方留言或联系代码狗。 上一篇我们已经学会了如何使用微信支付的退款接口发起退款请求&#xff0c;并且能判断退款成功与否&#xff0c;为了安…

题解:ABC276E - Round Trip

题解&#xff1a;ABC276E - Round Trip 题目 链接&#xff1a;Atcoder。 链接&#xff1a;洛谷。 难度 算法难度&#xff1a;普及。 思维难度&#xff1a;提高。 调码难度&#xff1a;提高。 综合评价&#xff1a;困难。 算法 bfs。 思路 从起点周围四个点中任选两…

北京冬奥会 向世界展示了什么

01 北京冬奥会让全球的目光&#xff0c;再次聚焦到中国。大家深刻感知到了一个巨大的变化&#xff1a;从过去中国需要融入世界&#xff0c;需要走向全球化&#xff0c;到今天世界需要中国&#xff0c;中国做好了准备。从2008年北京奥运会&#xff0c;到2022年北京冬奥会&#…

我们该不该旗帜鲜明地反对李彦宏当选院士?

这几天&#xff0c; 中国工程院对外公布2019年 院士增选候选人&#xff0c;百度董事长兼 首席执行官 李彦宏位列其中。尽管&#xff0c;最终有望从531名候选人中脱颖而出的&#xff0c;可算凤毛麟角。但是&#xff0c;针对李彦宏的候选&#xff0c;还是有网友喊出了“旗帜鲜明地…

程序员为什么应该旗帜鲜明地反对“最佳实践”?

让第一个版本的系统混乱一点&#xff0c;或许是件好事。 作者 | 黄峰达&#xff0c;CSDN 博客专家 Phodal 责编 | 唐小引 头图 | 作者绘制并授权 CSDN 使用 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 最近&#xff0c;我在设计、开发、维护一个基于『文档代码…

旗帜鲜明地反对“码而优则仕”

点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复“大礼包”有惊喜礼包&#xff01; 每日英文 Real strong men are not those without tears,but those running in tears. 真正的强者&#xff0c;不是没有眼泪的人&#xff0c;而是含着眼泪奔跑的人。 每日…

微软GitHub旗帜鲜明抵制996!

作者 | 伍杏玲 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 自3月27日996.ICU话题诞生以来&#xff0c;已引发国内外持续不断地关注和热议。国内大佬忙着发声&#xff0c;主流浏览器忙着屏蔽项目的GitHub地址。 而马云几天前谈的“996成功论”&#xff0c;被图…

我的世界java什么村民卖地图_教程/村民交易大厅

此条目的(部分)内容需要翻译。 你可以帮助我们来翻译此条目,但请勿使用机器翻译。 这篇教程将教你如何建造一个村民交易大厅。 主条目:交易 村民交易大厅要求最大限度地增加易于达到的村民数量,也要求提供一个快速遗弃并替换不需要的村民的途径。 村民交易大厅中有三个部分:…

旗帜鲜明的反对基因编辑婴儿!

阅读本文大概需要 3.3 分钟。 昨天的新闻&#xff0c;相信大家都知道了&#xff0c;媒体报道称世界首例免疫艾滋病的基因编辑婴儿在中国诞生&#xff0c;这事引起大家激烈的讨论&#xff0c;后台很多人问我对这件事是什么看法&#xff0c;我不是生物医学领域内的科学家&#xf…

攻防世界web刷题

web新手区 view_sourcerobotsbackupcookiedisabled_buttonweak authsimple_phpget_postxff_refererwebshellcommand_execution view_source 打开源代码发现答案就在这里 robots 查看robots.txt文件 发现flag文件并打开 backup 网站存在备份文件&#xff0c;常见的备份文件…