一、bindme

官方定义: is a helper to bind a list of methods to an object reference

理解: 因为不推荐在render()里构建函数,作者就用了6行代码封装了函数绑定事件的代码.

bindme的npm包实际上由6行ES5代码组成,但是确实方便了很多.这个包值得一用

二、用法

代替箭头函数和多层bind

有时候我们并不会直接在创建事件的时候`bind`,而是统一在constructor上绑定事件,如果一个模块大起来,就会出现好几十行绑定事件的代码,用`bindme`可以很好解决.例如
```
//原写法
this.clickEvent1 = this.clickEvent1.bind(this)
this.clickEvent2 = this.clickEvent2.bind(this)
this.clickEvent3 = this.clickEvent3.bind(this)
this.clickEvent4 = this.clickEvent4.bind(this)
this.clickEvent5 = this.clickEvent5.bind(this)

//bindme写法

bindme(this, 'clickEvent1', 'clickEvent2', 'clickEvent3', 'clickEvent4', 'clickEvent5')

又好看又方便

也可以在`super`构建实例的时候绑定

bindme(super(props),

'clickEvent1',

'clickEvent2',

'clickEvent3',

'clickEvent4',

'clickEvent5',

)


就是这么简单的用法, 我们可以看看它的源码转换成ES6是怎么样的

const bindme = (self, ...funcs) => {

funcs.forEach(func => {

if (self[func]) {

self[func] = self[func].bind(self)

} else {

console.error(Method ${func} is not defined)

}

})

}


其实也就是收集所有的事件,再统一bind,如果不存在的抛出异常.我们在平时也会经常封装一些类似这些小的便捷操作 <h3>结合React</h3>

import React,{ PureComponent } from 'react'

import bindme from 'bindme'

import './style.css'

export default class BindmeComp extends PureComponent{

constructor(props){

bindme(super(props),

'bindmeOnMouseOver'

)

    this.initClickMode = this.initClickMode.bind(this)

    bindme(this, 'bindmeFirClickMode', 'bindmeSecClickMode')
} noThisClickMode(){
console.log('未绑定this事件 =========>', this)
} initClickMode(){
console.log('普通bind事件 ===========>', this)
} arrowClickMode = () => {
console.log('箭头函数bind事件 ===========>', this)
} bindmeFirClickMode(){
console.log('bindme事件1 ===========>', this)
} bindmeSecClickMode(){
console.log('bindme事件2 ===========>', this)
} bindmeOnMouseOver(){
console.log('bindme事件3 ===========>', this)
} render(){
return(
<div>
<div className="list">
<span>未绑定this事件</span>
<button onClick={ this.noThisClickMode }>点击</button>
</div>
<div className="list">
<span>普通bind事件</span>
<button onClick={ this.initClickMode }>点击</button>
</div>
<div className="list">
<span>箭头函数事件</span>
<button onClick={ this.arrowClickMode}>点击</button>
</div>
<div className="list">
<span>bindme</span>
<button onClick={ this.bindmeFirClickMode }>点击</button>
</div>
<div className="list">
<span>bindme2</span>
<button onClick={ this.bindmeSecClickMode } >点击</button>
</div> <div className="list">
<span>bindme3</span>
<button onMouseOver={ this.bindmeOnMouseOver } >滑过</button>
</div>
</div>
)
}

}


![](https://img2018.cnblogs.com/blog/1414709/201810/1414709-20181002151152656-431142478.png) 上面基本覆盖了常用的事件绑定情况.我们看看都会输出什么? ![](https://img2018.cnblogs.com/blog/1414709/201810/1414709-20181002151326789-2063352033.png) 可以看到,除了第一个this为undefined外,其他都是正常绑定在了组件上 <h3>扩展一下React的this</h3>
我们先从我们最熟悉js的`this`说起; 面试官经常会问,什么是this?this指向什么?
一般来说:
<b>谁调用该`function`,该函数的this就指向这个调用方</b> 有一个特殊的情况,ES6的箭头函数,也是面试官特别喜欢的一个东西(但它确实好用),由于箭头函数不存在this,所以它的this是由上一层继承而来的.所以可以得出结论<b>箭头函数的this始终指向构造时的对象,而不是使用时的对象</b> 另外箭头函数还有一些不同于普通函数的特性,比如: 不可以当作构造函数使用,即不可以`new`. 不可以使用`arguments`属性等等 总结一句话就是:
<b>普通函数this是动态的,而箭头函数的this是静态的</b> <h4>我们细说一下React的this. </h4>
因为React组件是通过`class`构造的,所以组件里的所有属性,所有方法都可以通过this来获取,例如我们经常使用的属性state.就可以通过`this.state.xxx`获取 所以我们只需要保证this永远指向该构造对象(组件)即可,所以我们一般不会通过function来创建函数(会使得this动态指向调用function的对象), 并且: <b>React组件类的方法没有默认绑定this到组件实例,需要手动绑定。</b> 所以就衍生出了绑定this的方法;常用的有四种,我们一般会使用在constructor里面bind

//优先级最高

constructor(props){

super(props);

this.handleEvent = this.handleEvent.bind(this)

}

这种和直接在构建事件中绑定很像对吧?

```
原理虽然是一样的,但是性能却差了一大截.为什么?

我们知道只要state值改变了,就会导致render重新渲染,如果直接在创建事件绑定,那每一次渲染的时候都需要重新绑定一次,会大大降低性能.相反,只要在构造的时候绑定,无论渲染多少次,绑定都还是一次

此外还有比较常用的箭头函数绑定法和::绑定法

前面也介绍了箭头函数this的知识,所以在React出现也是蛮高的

handleEvent = () => {
...
} <input onChange={this.handleEvent} />

::虽然也可以绑定this,但是因为不能传参数,所以不经常使用

handleEvent = () => {
...
} <input onChange={::this.handleEvent} />

每日质量NPM包事件绑定_bindme(详解React的this)的更多相关文章

  1. 每日质量NPM包复制_copy-to-clipboard

    一.copy-to-clipboard 官方定义: Simple module exposing copy function 理解: 一个超级简单的复制功能,并且这种方法适用于通过别的事件触发复制功能 ...

  2. 每日质量NPM包模态框_react-modal

    一.react-modal 官方定义: Accessible modal dialog component for React.JS 理解: 一个容易使用的React模态框组件 二.用法 有时候我们不 ...

  3. 每日质量NPM包拖拽文件上传_react-dropzone

    一.react-dropzone 官方定义: Simple HTML5-compliant drag'n'drop zone for files built with React.js. 理解: 一个 ...

  4. 每日质量NPM包-classnames

    一.classnames 现在到处都追求效率开发,所谓存在即合理,各种各样的开源包/项目火热,也是因为他们大大解决了之前复杂的逻辑.作为榜上前10的热门包:classnames.还真需要了解了解它才能 ...

  5. JQuery在循环中绑定事件的问题详解

    JQuery在循环中绑定事件的问题详解 有个页面上需要N个DOM,每个DOM里面的元素ID都要以数字结尾,比如说 ? 1 2 3 <input type="text" nam ...

  6. jquery移除、绑定、触发元素事件使用示例详解

    这篇文章主要介绍了jquery移除.绑定.触发元素事件使用示例详解,需要的朋友可以参考下. unbind(type [,data]) //data是要移除的函数 $('#btn').unbind(&q ...

  7. Linux双网卡绑定bond详解--单网卡绑定多个IP

    Linux双网卡绑定bond详解 1 什么是bond 网卡bond是通过多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,在生产场景中是一种常用的技术.Kernels 2.4.12及 ...

  8. javascript event(事件对象)详解

    javascript event(事件对象)详解   1. 事件对象     1. 事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 什 ...

  9. Fiddler抓取https请求 & Fiddler抓包工具常用功能详解

    Fiddler抓取https请求 & Fiddler抓包工具常用功能详解   先来看一个小故事: 小T在测试APP时,打开某个页面展示异常,于是就跑到客户端开发小A那里说:“你这个页面做的有问 ...

随机推荐

  1. AlphaGo设计师黄士杰:“最强的学习技能在人类的脑袋里”

    AlphaGo设计师黄士杰:“最强的学习技能在人类的脑袋里” 深度学习和强化学习结合看来才能解决彩票预测的问题 可以这么说,AlphaGo的成功就是深度学习与强化学习的胜利,因为两者结合在一起,建构判 ...

  2. windows.onload和body的onload属性的区别

    关于windows.onload和body的onload属性的区别网上有些说法说的也不太统一,现在系统说下: 先看共同点: 都是body内容体加载结束执行: window.onload 内部方式可以 ...

  3. Chrome插件消息传递实例

    首先吐槽"360极速浏览器应用开发平台"的开发文档,在消息传递(http://open.chrome.360.cn/extension_dev/messaging.html)一节中 ...

  4. DOM jquery

    DOM  文档对象模型(Document Object Model)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM ...

  5. Autel MaxiSys Elite Diagnostic Tool Common problem solving methods

    1. updating MaxiFlash Elite to firmware 3.21? My maxisys communicate with the MaxiFlash J2534 but Ma ...

  6. 在linux中安装memcache服务器

    挂载光盘   mkdir -p /media/cdrom   mount /dev/cdrom /media/cdrom   设置yum cd /etc/yum.repos.d/ mv CentOS- ...

  7. 简单的图像显著性区域特征提取方法-----opencv实现LC,AC,FT

    https://blog.csdn.net/cai13160674275/article/details/72991049?locationNum=7&fps=1 四种简单的图像显著性区域特征 ...

  8. Java连接数据库 #02# JDBC经典套路

    内容索引 LocalConnectionFactory.java LocalConnectionProxy.java ProfileDAO.java-2.0 ProfileDAOImpl.java-2 ...

  9. IntelliJ IDEA. Debug模式

    资料收集: https://www.bilibili.com/video/av6749471/?p=16 eclipse debug模式. 基础 Intellij Idea--Debug使用 Inte ...

  10. python通过sftp远程传输文件

    python提供了一个第三方模块paramiko,通过这个模块可以实现两台机器之间的网络连接,sftp是paramiko的一个方法,使用sftp可以在两台机器之间互相传输 拷贝文件.然而paramik ...