react初学03(事件绑定)

129 阅读1分钟

事件绑定

类组件的事件绑定

<button onClick={()=>this.addN()}>n+1</button>

  • 传一个函数给,onClick即可,注意c大写
  • 思考一个问题,下面这样写可以吗?? <button onClick={this.addN}>n+1</button>
  • 有一点问题,这样会使得this,addN里的this变为window
  • 还有一种写法<buttomn onClick={this.addN.bind(this)}>n+1</button>
  • 这样写是可以的,因为它返回了一个绑定当前this的新函数
  • 但是这样太麻烦了
  • 可以把第一中修改一下 使用 this._addN = ()=>this.addN()
  • 给箭头函数取个名字<button onClick = {this.addN}>n+1</button>
  • 可以直接写为
costructor(){
this.addN = () =>this.setState({n: this.state.n+1})
render(){
return <button onClick={this.addN}>n+1<button>
}
}

类组件的事件绑定最终写法

class SOn extends React.Component{

addN = () =>this.setState({ n: this.state.n + 1});
render(){
return <button onClick={this.addN}>n+1</button>
}
}
  • 这里的addN等价于上面constructor中的addN 例如:
class Son ectends React.Component{

addN = () => this.setState({ n: this.state.n + 1});//是对象本身的属性,这意味着每个Son组件都有自己的addN,如果有两个Son,就有两个addN
addN(){//这个是对象的共有属性(也就是原型上的属性),这意味着所有的son共用一个addN
this.setState({n: this.state.n + 1})}
}//两个addN 有什么区????

为什么this会变/不会变

  • 所有函数的this都是参数,由调用决定,所以可变
  • 唯独箭头函数的this不变,因为箭头函数不接受this

关于this调用的两个例子


var a = {name:'里面name',
sayName:function(){
console.log("this.name= "= this.name);
}
};
var name = "外面name";
function sayName(){
var sss = a.sayName;
sss();                                  //sss.call(undefined)
a.sayName();                            //a.sayName.call(a)
(a.sayName)();                          //(a.sayname).call(a)
(b = a.sayName)();                      //b.call(undefined)
}
sayName();
var length = 10;
function fn(){
console.log(this.length);

}
var obj = {

length:5,
method: function(fn){
fn();  //fn.call.(undifined)
arguments[0]();  arguments[0].call(arguments) 10
}
};
obj.method(fn ,1)    // obj.method.call(obj,fn,1) 2