React中事件绑定this指向的三种解决办法

首先看一下哪三种办法:① 箭头函数 (推荐)

                                        ② Function.prototype.bind()

                                        ③ class 的实例方法

话不多说,我们直接上案例吧!

1:箭头函数 (利用箭头函数自身不绑定this的特点)


class App extends React.Component {
  state = {
    count: 0,
  };

  // 事件处理程序
  onIncrement() {
    console.log('事件处理程序中的this:', this)
    this.setState({
      count:this.state.count + 1
    })
  }

  render() {
    return (
      <div>
        <h1> 计数器: {this.state.count}</h1>
        {/* 箭头函数中的this指向外部环境,此处为 render() 方法 */}
        {/* render() 方法中的this为组件实例,可以获取到setState() */}

        <button onClick = { () => {this.onIncrement()}}>+1</button>
        
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));

2. Function.prototype.bind()

    利用ES5中的bind方法,将事件处理程序中的this与组件实例绑定到一起

 class App extends React.Component{

  constructor() { 
    //super() 语法要求
    super()
    this.state = {
      count:0
    }
    //bind改变this指向
    this.onIncrement = this.onIncrement.bind(this)
  }
  onIncrement() {
    this.setState ({
      count:this.state.count + 1
    })
  }

  render() {
    return (
      <div>
        <h1>计数器:{this.state.count}</h1>
        <button onClick={this.onIncrement}>+1</button>
      </div>
    )
  }
}
ReactDOM.render(<App/>,document.getElementById('root')) 

tip: 在用bind处理this指向的时候,一般我们都在constructor()里面来对this进行绑定,里面有固定          写法语法的要求请稍加注意

3. class 的实例方法

    利用箭头函数形式的class实例方法(推荐)

    该语法是实验性语法,但是,由于babel的存在可以直接使用

 class App extends React.Component {
// 第一种方式
// constructor() {
//   super()
//   this.state = {
//     count: 0
//   }
// }

// 第二种方式

  state = {
    count: 0
  } 

  // 只需要箭头函数就可以
  addJian=() => {
    this.setState ({
      count: this.state.count + 1
    })
  }
  render() {
    return (
      <div>
      <h1>计数器:{this.state.count}</h1>
        <button onClick={this.addJian}>+1</button>
      </div>
    )
  }
}

ReactDOM.render(<App/>,document.getElementById('root')) 

tip: 此代码上面还还介绍了state的两种写法

欢迎大家一起交流!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值