06 事件处理函数绑定与事件对象

事件处理函数绑定

  • DOM事件处理 addEventListener or onclick = function(){} 纯小写
  • React元素也采用了类似DOM0标准中的事件属性定义的方法 小驼峰
  1. JSX <button onClick={ this.doSth }></button>
  2. 直接创建React元素
React.createElement('button',{onClick: { this.doSth }},'按钮'
)

阻止a标签默认行为

  • a标签锚点
class MyAlink extends React.Component {handleClick() {console.log('点击')}render() {return <a href="#" onClick={this.handleClick}>a链接</a>}
}
ReactDOM.render(<MyAlink />,document.getElementById('app')
)

在这里插入图片描述

  • 使用伪协议在React中会报warning
<a href="javascript:;" onClick={this.handleClick}>a链接</a>

在这里插入图片描述

  • 阻止默认事件 e(React事件对象,并非js原生的e)
class MyAlink extends React.Component {handleClick(e) {e.preventDefault()console.log('点击', e)}render() {return <a href="#" onClick={this.handleClick}>a链接</a>}
}

在这里插入图片描述

事件对象

  • SyntheticBaseEvent 合成基础事件对象
  • 这个SBE是遵守W3C事件对象的规范的,不存在任何的浏览器兼容性问题
    在这里插入图片描述

React为什么要将事件处理直接绑定在元素上

  • React认为事件处理和视图有直接关系,写在一起可以更直观地表述视图与逻辑的关系,便于维护

this指向

  • ES6 class模块默认不对事件处理函数进行this的再绑定
class MyButton extends React.Component {handleClick() {console.log('this', this)// this默认undefined}render() {return <button onClick={this.handleClick}>按钮</button>}
}
ReactDOM.render(<MyButton />,document.getElementById('app')
)
function outerClick() {console.log('outher-this', this)// 依然是undefined
}
class MyButton extends React.Component {render() {return <button onClick={outerClick}>按钮</button>}
}
ReactDOM.render(<MyButton />,document.getElementById('app')
)
  • DOM0事件
// this指向button
<button onclick="console.log(this)">123</button>

解决this指向 建议使用134

  1. 在构造器中bind this 隐式传入e
  2. 在视图中bind this 隐式传入e
  3. 回调 + 箭头函数 + 方法执行(render函数每次执行时都会创建新的回调)
    注意:给子组件的属性传递函数时,由于每次都创建一个回调,子组件每次都接收一个新的函数,可能触发子组件的render 显式传入e
  4. class field写法:class内部的箭头函数

事件对象都在最后一个参数

// 在构造器中bind this
class MyButton extends React.Component {constructor(props) {super(props)this.handleClick = this.handleClick.bind(this)}handleClick() {console.log('this', this)// this指向类MyButton}render() {return <button onClick={this.handleClick}>按钮</button>}
}
// 在视图中bind this
class MyButton extends React.Component {constructor(props) {super(props)}handleClick(e) {// bind方法要使用e,无须传入,是隐式传入的 console.log('this', this, e)// this指向类MyButton}render() {return <button onClick={this.handleClick.bind(this)}>按钮</button>}
}
// 回调 + 箭头函数 + 方法执行
class MyButton extends React.Component {constructor(props) {super(props)}handleClick(e) {// 要使用e则需要传入econsole.log('this', this)// this指向类MyButton}render() {return <button onClick={(e) => this.handleClick(e)}>按钮</button>}
}
  • 用在子组件上时,父组件每次render都创建一个新的回调,fn是响应的,会触发子组件的render
    render() {return (<div><button onClick={() => this.handleClick()}>按钮</button><Title fn={() => this.doSth} /></div>)}
// class内部的箭头函数
class MyButton extends React.Component {constructor(props) {super(props)}// 实验性写法outerClick = () => {console.log('outher-this', this)// 箭头函数的this是稳定的 指向button}render() {return (<div><button onClick={this.outerClick}>按钮</button></div>)}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

07、08 条件渲染、列表渲染

条件渲染 React没有像v-if、v-show这样的指令&#xff0c;需要使用JSX表达式组合而成 // 与运算 三目 // 判断表达式一定是false/null/undefined时才不会被渲染&#xff0c;0、空字符串、NaN会显示 // 如果render函数返回null&#xff0c;不会进行任何渲染 ......state {showL…

面向对象命名空间、组合

一 类命名空间与对象、实例的命名空间 创建一个类就会创建一个类的名称空间&#xff0c;用来存储类中定义的所有名字&#xff0c;这些名字称为类的属性 而类有两种属性&#xff1a;静态属性和动态属性 静态属性就是直接在类中定义的变量动态属性就是定义在类中的方法class Pers…

css --- 使用媒体查询当屏幕宽度小于某个值时,隐藏掉某个类

Bootstrap提供了一个封装好的类: .hidden-xs: 当屏幕宽度<768px时隐藏 .hidden-sm: 当屏幕768px < 宽度<992px时隐藏 .hidden-md: 当屏幕992px< 宽度<1200px时隐藏 .hidden-lg: 当屏幕宽度>1200px时隐藏 下面使用css3的 媒体查询来实现: media screen and…

css --- 伸缩布局,让图片居中

很明显,想要星星位于文字的正下方. // html <section id"lz_about" class"hidden-xs hidden-sm"><div class title text-center"><h1><strong>关于我</strong></h1><img src"./imgs/star.jpg" cla…

10 非受控组件以及受控与非受控的选择方案

含义 非受控组件&#xff1a;表单数据不受控与state的&#xff08;未绑定value&#xff09;&#xff0c;使用React ref从DOM节点中获取表单数据的组件提示refs弃用 class MyForm extends React.Component {constructor(props) {super(props)}submit (e) > {e.preventDef…

wampserver3.0.6 外网 不能访问

# 开始 今天在服务器上安装了wampserver3.0.6 然后在我的电脑浏览器上面打开服务器ip提示 Forbidden 下面一行小字提示没有权限访问"/"目录 # 解决 打开 httpd-vhost.conf 文件 修改成如下 # Virtual Hosts #<VirtualHost *:80>ServerName localhostServerAlia…

javascript --- 在linux上部署项目

最近对照视频,用bootstrap jquery 写了一个纯前端页面.想把它放在服务器上,供远程使用. 准备服务器和域名 我服务器和域名是在腾讯云上租的,网址: https://cloud.tencent.com/ 注: 域名很便宜,挑个好的哈哈哈… 服务器(阿里云有个学生价…但是我那个学生价的账号找不到了…)…

11 父子组件数据关系与状态提升

含义 状态提升&#xff1a;两个组件&#xff08;无父子关系&#xff09;共享一个数据并且同步数据变化类组件调用&#xff08;实例化&#xff09;的时候&#xff0c;组件内部的状态是唯一且独立的组件嵌套与调用&#xff0c;和是类组件&#xff08;render&#xff09;还是函数…

工具分享 --- 分享一个在线制作ico的网站

还不错… 生成后一般放在imgs的下面. link:favicon tab 导入链接http://www.faviconico.org/

laravel迁移文件

laravel迁移文件的命令 Laravel鼓励敏捷、迭代的开发方式&#xff0c;我们没指望在第一次就获得所有正确的。我们对于自己编写代码,可以通过迁移文件,不断的重复去测试.对于工作&#xff0c;我们开发一个完整的项目,是需要我们每个人相互配合,就好比用svn,git版本控制工具来存储…

12 组合与继承、CSS Module

组合与继承 若Container内部有内容&#xff0c;React会在props内部增加children属性若Container内部有非元素内容&#xff0c;children&#xff1a;非元素内容若Container内部有单个元素内容&#xff0c;children&#xff1a;React元素对象若Container内部有多个元素内容&…

工具分享 --- tinyPNG,大图片压缩工具

今天自己的写的项目跑在了远程服务器上… 图片加载的速度让人难以接受, 于是各种百度找到了一个在线找到了个图片压缩的网站 TinyPNG 可以看一下压缩的效果…真心不错啊… 网站如下: https://tinypng.com 额…有些大于5M的需要钱,才能压缩… 用系统画图工具…貌似也能压缩… …

14 代码分割之lazy:Suspense与路由懒加载

lazy内置方法 Suspense内置组件 lazy是React提供的懒&#xff08;动态&#xff09;加载组件的方法&#xff0c;React.lazy() 能减少打包体积、延迟加载首屏不需要渲染的组件 依赖内置组件Suspense&#xff1a;给lazy加上loading指示器组件的一个容器组件 Suspense目前只和la…

css --- 兄弟选择器

语法: /* 查找后边的一个兄弟元素 */ 兄弟元素 兄弟元素/* 查找后边的所有兄弟元素 */ 兄弟元素 ~ 兄弟元素<head><style>#maindiv {color: red;}#main~div {background-color: #e0e0e0;}</style> </head> <body><div id"main"&g…

15 错误边界与使用技巧

错误边界 React16增加防止某个组件的UI渲染错误导致整个应用崩溃子组件发生JS错误&#xff0c;有备用的渲染UI错误边界是组件&#xff0c;只能用class组件来写 错误边界组件捕获错误的时机 渲染时生命周期函数中组件树的构造函数中 getDerivedStateFromError 生命周期函数…

es6 --- Promise.all等待多个异步任务执行

项目中遇到一个问题,要用多个http请求,获取数据,然后将获取的数据统一处理… 第一反应想到用promise.all来做… 下面进入主体 // 首先使用promise封装http请求. function getListByDetecttype (params) {return new Promise((resolve, reject) > {let param params ? par…

Mac 下查看网络端口占用情况

1、Mac 下查看网络端口占用情况 有的时候关闭了服务器&#xff0c;但是端口还是占用&#xff0c;解决的方法是 kill 掉占用该端口的进程。 # 查看 8009 端口的占用情况 $ lsof -i:8009 可以看到&#xff0c;该端口被 id 为 4215 的进程所占用&#xff0c;这个时候直接在命令…

javascript --- 变量提升的理解

看下面一段代码: (function () {var x foo();var foo function foo () {return "foobar";};return x; })();(不许打出来)猜猜返回结果是什么… 答案是 // foo is not a function下面来解释为什么会这样,首先得明白: 1.如果变量声明了但未赋值,则会显示undefined…

分布式监控系统开发【day37】:需求讨论(一)

本节内容 为什么要做监控&#xff1f; 常用监控系统设计讨论监控需求讨论如何实现监控服务器的水平扩展&#xff1f;监控系统架构设计一、为什么要做监控&#xff1f; 熟悉IT监控系统的设计原理开发一个简版的类Zabbix监控系统掌握自动化开发项目的程序设计思路及架构解藕原则…

iOS:练习题中如何用技术去实现一个连线题

一、介绍 本人做的app涉及的是教育行业&#xff0c;所以关于练习题的开发肯定是家常便饭。例如&#xff0c;选择题、填空题、连线题、判断题等&#xff0c;每一种题型都需要技术去实现&#xff0c;没啥多大难度&#xff0c;这里呢&#xff0c;就给出实现连线题的核心代码吧。过…