前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于React的一些奇奇怪怪问题

关于React的一些奇奇怪怪问题

作者头像
娜姐
发布2022-06-12 14:34:04
5060
发布2022-06-12 14:34:04
举报
文章被收录于专栏:娜姐聊前端

问题一:为什么React事件处理函数会丢失this

写Class类型React组件时,大家都会记得要将事件函数绑定this,如下:

代码语言:javascript
复制
class Button extends React.Component {
 
constructor(props) {
    super(props);
   // this绑定
    this.handleClick = this.handleClick.bind(this);
  }
 
  handleClick(){
    console.log('this is:', this);
  }

  render() {
    return (
      <button onClick={this.handleClick}>Click me </button>
    );
  }

明明我们指定了this.handleClick,调用者是this,怎么就丢了呢? 这是因为,在React(或者说JSX)中,传递的事件参数不是一个字符串,而是一个实实在在的函数。

也就是说,在做onClick={this.handleClick}赋值操作后,React真正调用的是onClick(),而onClick是dom事件,并不是类中的方法,此时的this其实指向的是全局作用域,而这个作用域下并没有setState方法,所以自然报undefined错误。

所以,这是一个JS本身的问题,而不是React的问题。可参考官方解释

Handling Events

我们再看一下JS中this本身的陷阱,对比上面的例子,就更好理解了。

代码语言:javascript
复制
let obj = {
    tmp:'Yes!',
    testLog:function(){
        console.log(this.tmp);
    }
};
obj.testLog();

打印值:Yes!,符合期望。修改一个版本再看看。

代码语言:javascript
复制
let obj = {
    tmp:'Yes!',
    testLog:function(){
        console.log(this.tmp);
    }
};
let test = obj.testLog;
test();

打印值:undefined,好吧,this这时指向window了。 看一看,let test = obj.testLog;onClick={this.handleClick}是不是一样,都是赋值操作呢?所以,最后的结果自然一样了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题一:为什么React事件处理函数会丢失this?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档