我正在浏览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”。
为什么会这样?
您可以在此行上设置断点并检查调用堆栈。
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检查器会指示事件已注册,并应使用上述功能体进行注册。 因此,我得出结论,我无法在实际标签上注册事件(不过,我不确定为什么会这样)。我如何才能实现这一目标呢? 问题答案: 这取决于