在一个简化的示例中,我在触发componentDidUpdate后重命名页面的标题(例如,通过属性更改)
componentDidUpdate() {
document.title = "Some Custom Title"
}
我注意到的是,在componentDidUpdate再次被触发之前,标题不会反映“一些自定义标题”。
但是,在我将它 Package 在setTimeout中之后,它 * 确实 * 会更新:
componentDidUpdate() {
setTimeout(() => {
document.title = "Some Custom Title"
}, 0)
}
为什么呢?有没有更优雅的方法来触发标题的改变?(我只限于类组件)
1条答案
按热度按时间qaxu7uf21#
您遇到的问题是由于React的批处理更新造成的。当您更新状态或属性时,React会对更新进行批处理并在单个批处理中应用它们。这有助于通过减少浏览器需要重新呈现组件的次数来提高性能。
但是,在更新文档标题时,这种批处理有时会导致意外行为,因为它可能不会立即更新以响应更改。
将字幕更新包在“setTimeout”中并设置为零延迟的原因是,它允许浏览器在更新字幕之前完成当前渲染。这意味着字幕更新与组件更新不是同一批的一部分,因此它会立即应用。
如果限制为类组件,还可以使用“componentDidUpdate”中的“setState”方法触发渲染并应用标题更改:
在这种情况下,使用空对象调用“setState”会触发渲染,并且回调函数会在渲染完成后更新标题。