【发布时间】:2017-06-24 16:39:22
【问题描述】:
我需要设置一个从事件中获得的状态字段,但是当我将函数传递给它时它没有被设置。组件和方法如下所示:
constructor(props: SomeProps, context: any) {
super(props, context);
this.state = {
isFiltering: props.isFiltering,
anchor: "",
};
}
private toggleFilter = (event: any) => {
event.persist()
this.setState(prevState => ({
isFiltering: !prevState.isFiltering,
anchor: event.currentTarget // does not work, it's null
}));
}
如果我删除 event.persist(),则会收到以下错误:
出于性能原因,会重复使用此合成事件。如果您看到这一点,则表示您正在访问方法
currentTarget对已发布/无效的合成事件。这是一个无操作功能。如果您必须保留原始合成事件,请使用 event.persist()。请参阅https://facebook.github.io/react/docs/events.html#event-pooling 了解更多信息。
由于某种原因,以下代码有效:
private toggleFilter = (event: any) => {
this.setState({anchor:event.currentTarget}) // works fine
this.setState(prevState => ({
isFiltering: !prevState.isFiltering,
}));
}
为什么上述方法有效但我使用this.setState(prevState=> ...) 时无效?
【问题讨论】:
-
我认为这是因为
setState是“异步”的,所以当你传递给setState的函数被执行(并且事件被访问)时,事件已经不在了。在第二个版本中,立即访问事件并将其currentTarget传递给setState。 -
@thirtydot 谢谢,这是有道理的,但似乎
event.persist()是解决这个问题的合适方法,但它对我来说有点不起作用.. -
是的。我不确定为什么它不起作用(没有自己测试),所以我没有写答案。
-
应该没问题???
-
您有什么特别的原因不想使用它吗?
private toggleFilter = (event: any) => { this.setState({ isFiltering: !this.state.isFiltering, anchor: event.currentTarget }); }。可能更容易理解。
标签: javascript reactjs