javascript - React 类组件异常 this 对方法的绑定
问题描述
对于如下示例类组件:
class Todo extends Component {
state = {
list: ["First Todo"],
text: ""
};
handleSubmit(e) {
e.preventDefault();
if (this && this.setState) {
console.log("this present in handleSubmit");
this.setState(prevState => ({
list: prevState.list.concat(this.state.text),
text: ""
}));
} else {
console.log("this not present in handleSubmit");
}
}
handleChange(e) {
if (this && this.setState) {
console.log("this present in handleChange");
this.setState({
text: e.target.value
});
} else {
console.log("this not present in handleChange");
}
}
removeItem(index) {
if (!this || !this.setState) {
console.log("this not present in removeItem");
}
console.log("this present in removeItem");
const list = this.state.list;
list.splice(index, 1);
this.setState({ list });
}
render() {
return (
<div>
<h1>TODO LIST</h1>
<form onSubmit={this.handleSubmit}>
<input value={this.state.text} onChange={e => this.handleChange(e)} />
<button>Add</button>
<ol>
{this.state.list.map((item, index) => {
return (
<li key={index}>
{item}
<button onClick={() => this.removeItem(index)}>Delete</button>
</li>
);
})}
</ol>
</form>
</div>
);
}
}
绑定到类方法的行为this
并不一致。
玩弄这个组件,我们会发现,handleChange
并且removeItem
有正确的this
上下文,而上下文handleSubmit
为.this
undefined
两个具有正确this
上下文的函数在 jsx 中都表示为箭头函数。如下所示:
<input value={this.state.text} onChange={e => this.handleChange(e)} />
虽然handleSubmit
作为函数本身传递。如下所示:
<form onSubmit={this.handleSubmit}>
但是,我真的不知道为什么会这样。因为,在我的理解中,函数如何传递并不重要,即作为函数本身或上面的箭头表示。
解决方案
箭头函数有词法this
。这意味着它的值是由周围的范围决定的。因此,当您使用它而不是class methods
将this
值映射到实例时。但是当您调用时this.onSubmit
this
将引用本地范围而不是实例本身。要解决它,请使用构造函数中的方法arrow functions
或方法。bind
onSubmit
constructor(props){
super(props)
this.onSubmit = this.onSubmit.bind(this)
}
推荐阅读
- blockchain - Blockchain.info API 访问
- vb.net - 如何在 .net 中截取 bmp 屏幕截图,其中整个表单不完全适合屏幕?
- salesforce - Salesforce 字段值在网页上不可见
- python - 使用正斜杠作为分隔符将单元格拆分/分解为 2 行 pandas
- onesignal - OneSignal 被 uBlock / AdBlocker 阻止
- ubuntu - ubuntu中超过3个DNS服务器
- python - 解压可迭代对象时转换变量的最佳方法是什么?
- python - 文件矩阵
- python - PySimpleGUI 主题更新?
- ios - 考虑到 AppGroups 使用 CoreData 创建新应用程序