[英]React invoking function calling setState passed in props of a stateless component
我正在使用React.JS制作过滤器组件。 这些过滤组件中的一些嵌入在面板( div
)中。 面板的包裹部分如下所示:
Initiative <a onClick={() => {this.setState({ showInitiatives: true })}} className="milestone-list-link" href="#initiative">
{this.state.selectedInitiative}
<InitiativeSelector
initiatives={initiatives || {}}
show={this.state.showInitiatives}
selector={
() => {
console.log('called selector state:', this.state)
this.setState({ showInitiatives: false })
}
}
/>
<FilterIcon />
</a>
我的<InitiativeSelector />
如下所示:
const InitiativeSelector = ({initiatives, show, selector}) => {
return (show) ? (
<div className="list-filter">
<div>
<input placeholder="Search..." />
</div>
<ul>
{
Object.values(initiatives).map((initiative, i) => <li onClick={() => {selector()}} key={i}>{initiative.name}</li> )
}
</ul>
</div>
) : null
}
当我运行它时,我的selector
会被调用。 因此,我看到状态被打印到控制台。 但是, this.setState({ showInitiatives: false })
似乎没有任何作用。 我的模态不会隐藏,第二次(等)单击<li>
, showInitiatives
仍设置为true
。
这是因为单击事件将DOM树与setState
异步特性结合在一起
首先li.onClick
触发调用setState({ showInitiatives: false})
调用selector
然后a.onClick
触发调用setState({ showInitiatives: true })
。 您可以通过添加log语句来检查它是否正确。
现在您有2个待处理的更新
{ showInitiatives: false}
{ showInitiatives: true}
合并时是noop。
您需要通过调用e.stopPropagation()
来停止li.onClick
内部的事件传播,或者重新考虑a.onClick
处理程序正在做什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.