1.react 的合成事件
react是虚拟dom 创建好以后挂在到真实的dom 上,所以react 中的事件(点击,滑动,触摸)机制也是虚拟的,react 为了防止滥用dom 的事件,同时屏蔽不同浏览器的差异,实现了一种合成事件层。在react 中当dom 层被点击的时候,然后事件冒泡直至document 层,document监听了所有的点击事件然后再响应在组件初始化的时候,绑定在组件上响应的方法。至此,便引出了bind 方法。
原生事件无论是冒泡还是捕获事件,都会比react 的合成事件执行早
2.apply,call,bind
bind 用到的地方: react以前的写法,用于绑定方法。将class 中的方法,绑定到组件下面,like this
class Index extends Component {
constuctor(props) {
this.onSubmit = this.onSubmit.bind(this);
}
onSubmit(){
...
}
}
bind 的用法和call 一样,第一个参数都是this,可以不传。然后就是位置参数,传入字符串,可以传多个。区别就是bind 返回的是一个方法。执行的时候,需要在后面加一个括号,然后运行。
var name = '小王',age = 17;
var obj ={
name:'小张',
objAge:this.age,
myfn:function(){
console.log(this.name+"年龄"+this.age);
}
}
var db = {
name:'德玛',
age:99
}
let bindfn=obj.myfn.bind(db);
//obj.myfn.bind(db)();
//obj.myfn.call(db);
//obj.myfn.apply(db);
bindfn();
//德玛年龄99
bind 不加括号就是将myfn 打印一下,bindfn 和obj.myfn 是同一个方法体,只不过是所属的对象不一样。
call 和apply 的用法区别只是apply的第二个参数是一个数组,可以将参数以数组的形式传进去。
可以这样理解,bind ,apply,call三个方法都是很一般的方法,当我们传入第一个参数this 的时候,就是告诉了浏览器,this所代表的这个方法也有了bind 前面的foo方法。第二个参数和以后的参数,都是为foo 提供参数的。
3还有一点,箭头函数也可以有bind ,apply ,call方法的,只不过第一个参数,也就是this ,会被箭头函数忽略掉