javascript - 为什么箭头函数可以解决其他需要 .bind 的问题?(SetInverval 调用使用 setState 的函数)
问题描述
React 文档实现了一个时钟来演示状态和生命周期等概念。
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount() {
clearInterval(this.timerID);
}
tick() {
this.setState({
date: new Date()
});
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
ReactDOM.render(
<Clock />,
document.getElementById('root')
);
我很好奇为什么componentDidMount
setInterval 使用箭头函数。没有它就不行,要么:
实施一:
setInterval(this.tick(), 1000)
通过执行以下操作,通过返回tick
而不是调用它:
实施二:
setInterval(this.tick, 1000)
这会引发setState is not a function
错误。
之前在stackoverflow上被问过,但接受的答案是错误的,因为它建议编码实现二。
我猜这个错误是由于this
. 在 setInterval 内部,没有this.setState
,这就是绑定解决它的原因(正如其他答案之一指出的那样)。
但是,我想知道箭头函数如何解决需要绑定的问题。
解决方案
推荐阅读
- php - 只想从数据库中的时间戳中保存年份
- spring-boot - Redis 异常:无法确定要读取的节点
- database - 如何将 oracle 转储文件上传到 oracle 数据库:AWS RDS
- ruby-on-rails - 如何在 Rails 5 项目中安装 Devise?
- javascript - json解析并获取成绩内的对象
- php - 中间件身份验证将 api 路由重定向到 /home
- java - 想要将 org.bytedeco.javacpp.lept.PIX 转换为 byte[] 和 Buffered Image
- php - 如何在 Drupal8 中向“站点信息”表单添加新的自定义字段
- mysql - 将 CSV 文件加载到表时日期值不正确
- jquery - 在 Rails 中将 $.ajax 更改为 $post