当前位置: 首页 > 知识库问答 >
问题:

反应:未绑定时,“this”为null,而不是在反应组件事件处理程序中未定义

程毅
2023-03-14

我正在浏览react文档中关于处理https://facebook.github.io/react/docs/handling-events.html

有一部分提到了以下一行:“在JavaScript中,类方法默认不被绑定。如果您忘记绑定this.handle单击并将其传递给onClark,当实际调用函数时,这将是未定义的。"

在Codepen上提供了一个示例。我试图通过注释掉“this.handleClick=this.handleClick.bind(this);”并在handleClick方法上添加“console.log(this)”来删除绑定。以下是经过编辑的分叉版本:http://codepen.io/anakornk/pen/wdOqPO

class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};

    // This binding is necessary to make `this` work in the callback
   // this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    console.log(this);
    this.setState(prevState => ({
      isToggleOn: !prevState.isToggleOn
    }));
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

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

根据文档中的上述语句,输出应为“未定义”,但显示为“null”。

为什么会这样?

共有1个答案

郁和通
2023-03-14

您可以在此行上设置断点并检查调用堆栈。

ReactErrorUtils.invokeGuardedCallback = function (name, func, a, b) {
  var boundFunc = func.bind(null, a, b); // <-- this is why context is null
  var evtType = 'react-' + name;
  fakeNode.addEventListener(evtType, boundFunc, false);
  var evt = document.createEvent('Event');
  evt.initEvent(evtType, false, false);
  fakeNode.dispatchEvent(evt);
  fakeNode.removeEventListener(evtType, boundFunc, false);
};
"use strict"

function fn() {
  return this;
}

console.log(fn(), fn.bind(null)())
 类似资料:
  • 问题内容: 我想在切换时更新状态,但在处理程序中未定义对象。根据教程文档,我应该引用该组件。我想念什么吗? 问题答案: ES6 React.Component不会自动将方法绑定到自身。您需要将它们自己绑定到构造函数中。像这样:

  • 问题内容: React 在promise中没有定义。这是我的代码: 这是错误代码: 问题答案: 可能没有约束力。 如果您可以使用ES6语法,请尝试用箭头函数替换。它会自动绑定: 或手动绑定:

  • 问题内容: 我有一个React组件,可以在其中遍历列表并创建行。每行中都有一个删除按钮。单击删除按钮后,我想将引用传递给该行中的元素。 因此,为了在点击处理程序中保留this值;我对map()和click-handler都使用bind。 这是将参数传递给React中的处理程序的正确方法还是有更好的方法? 问题答案: 我现在还很陌生,但我想我可以把它扔在这里以提供帮助。 我认为您需要更改此行, 至

  • 我试图通过反应路由器将道具从一个组件传递到另一个组件。当我试图从子组件获取道具时,我得到了这样一条消息。这是我的代码: Tracks.jsx: app.jsx: Album.jsx:

  • 问题内容: vidsAsHtml映射函数中的this关键字不断返回未定义。 我读了这个,还有其他一些关于这个的问题,但是他们的解决方案没有解决问题。我已经在地图上使用了es6语法箭头功能,但是我也尝试将其作为第二个参数,但这并不能解决问题。好奇是否有人知道为什么’this’关键字一直在这里未定义。 问题答案: 事件处理程序道具应传递给函数。当前,您正在尝试传递和作为事件处理程序的返回值,但无论如何

  • 问题内容: 我有一个叫做React的组件,有很多子组件(另一个React组件)。我希望能够从内部对每个事件声明一个事件。我尝试执行以下操作: 不用说,我没有得到任何“点击!” 出现在我的控制台中 Chrome中的React检查器会指示事件已注册,并应使用上述功能体进行注册。 因此,我得出结论,我无法在实际标签上注册事件(不过,我不确定为什么会这样)。我如何才能实现这一目标呢? 问题答案: 这取决于