温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

好程序员分享React-010-事件处理函数的this指向问题

发布时间:2020-06-25 05:34:57 来源:网络 阅读:247 作者:wx5d42865f47214 栏目:编程语言

好程序员分享React-010-事件处理函数的this指向问题区分普通函数与事件处理函数

1普通函数是直接调用的。不存在 this 指向问题,谁调用的,this 指向就是谁。

2普通函数没有事件对象 event

3事件处理函数其实也是一个函数,只是他绑定在某个事件上。

4事件处理函数的 this 默认指向 undefined

解决this指向问题的4种办法

1直接在事件绑定的地方加上 .bind(this)

<button onClick={this.handleClick.bind(this)}>点我</button>

2使用箭头函数

<button

  onClick={event => {

    this.handleClick(event);

  }}

>

  点我

</button>

3在构造函数中统一进行this指向的绑定

  constructor() {

    super();

 

    this.handleClick = this.handleClick.bind(this);

  }

 

  render() {

    return (

      <button onClick={this.handleClick}>点我</button>

    )

  }

4使用实验性质的 public class fileds 语法。要去使用的话,的需要babel插件的支持.

1安装 @babel/plugin-proposal-class-properties babel 插件

2 babel 的配置文件中,配置好

3从新启动项目

class App extends React.Component {

  handleClick = () => {

    console.log(this);

  };

}

 

为啥要使用 bind 来修改this指向,而不能使用 apply、call?

因为 apply 与 call 他们会直接执行函数,而 bind 会返回一个新的函数。

 

在调用子组件的时候,需要传递一个方法下去,这时这个方法的this绑定推荐使用哪几种:

推荐使用:在构造函数中的bind 与 public class fileds 语法。

 

1首先要知道的是,父组件render,子组件一定会render

2我们希望如果子组件没有发生变化,那么在 父组件render的时候,让子组件不做render。节省性能。

3要实现第2点,可以让子组件继承的是 PureComponent

4PureComponent 。它会帮助我们计算子组件接收到的porps 有没有发生变化,如果有那么就 render .如果没有就阻止render

<Child onFn1={this.handleFn1.bind(this)}  />

// 由于 .bind() 方法每次都会返回一个新的函数,所以这种方式不推荐。。。。

 

<Child onFn1={() => { this.handleFn1() }}  />

// 由于 每次执行到这行代码,箭头返回都是一个新的箭头函数,所以这种方式不推荐

 

constructor() {

  super();

  

  this.handleFn1 = this.handleFn1.bind(this)

}

 

<Child onFn1={this.handleFn1}  />

  

 // 由于 constructor 构造函数只会执行一次,后续执行到 Child 的代码,传递过去的 onFn1 没有发生变化

 // 所以这种方式推荐

 

<Child onFn1={this.handleFn1}  />

 

handleFn1 = () => {

  ...

}

  

// 这种方式同样也推荐。


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI