React中this指向问题

一、问题

例如 平常绑定事件我们一定会这么写

//创建组件
class Demo extends React.Component{
state = {
    name:'张三'
}
//展示左侧输入框的数据
showData(){
  alert(this.state.name); //此时的this为undefined
}
render(){
  return(
    <div>
      <button onClick={this.showData}>点我</button>&nbsp;
    </div>
  )
}
}
//渲染组件到页面
ReactDOM.render(<Demo a="1" b="2"/>,document.getElementById('test'))

为什么this没有指向当前类呢,其实很简单 this 本质上就是指向它的调用者 所以自然指向不会是当前类

例如如下案例

//创建一个Person类
class Person {
//构造器方法
constructor(name,age){
  this.name = name
  this.age = age
}
speak(){
  console.log(this);
}
}
const test = new Person('张三',19)
let speak = test.speak
test.speak() //当前实例
speak() //undefined

然而为什么是undefined不是window呢,因为class里面其实自带严格模式,在babel转义中也是严格模式的,如下图 在顶端加上了 "use strict";这样就开启的严格模式,所以就为undefined,好奇的小伙伴也可以试试

function fn(){
  "use strict";
  console.log(this);
}
fn()

 二、解决问题

        方法 一,用bind改变this指向

//创建组件
class Demo extends React.Component{
state = {
    name:'张三'
}
//展示左侧输入框的数据
showData(){
  alert(this.state.name); 
}
render(){
  return(
    <div>
      <button onClick={this.showData.bind(this)}>点我</button>&nbsp;
    </div>
  )
}
}
//渲染组件到页面
ReactDOM.render(<Demo a="1" b="2"/>,document.getElementById('test'))

        方法二,用es6的减头函数this指向上一层 特性

//创建组件
class Demo extends React.Component{
state = {
    name:'张三'
}
//展示左侧输入框的数据
showData = ()=>{
  alert(this.state.name); 
}
render(){
  return(
    <div>
      <button onClick={this.showData}>点我</button>&nbsp;
    </div>
  )
}
}
//渲染组件到页面
ReactDOM.render(<Demo a="1" b="2"/>,document.getElementById('test'))

额外在说说函数传参把,这里不能像vue一样,直接  onClick={this.showData('张三')} ,这样的它绑定的是showData的返回值,从而不能这么写

解决办法

onClick={()=>this.showData('张三')} //方法一
onClick={this.showData.bind(this,'张三')} //方法二

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值