我有一个Dashboard
组件,它在componentDidUpdate()
中有一些真正的DOM操作(它使用了一些图表库和d3.js)。
这些操作可能总共花费数百毫秒,我只是注意到在切换页面时,所有componentDidUpdate
都在浏览器绘制之前执行。顺序是:
我发现this issue表示这是故意行为。但这种行为使我的应用程序感到迟钝。因为在将页面从Foo
切换到Dashboard
时,用户会停留在Foo
并且必须等待大约0.6秒才能看到Dashboard
页面显示。
我目前的解决方法是使用setTimeout
包装这些DOM操作:
componentDidUpdate() {
setTimeout(() => this.expensiveDOMOperations(), 0)
}
此解决方案有效,这些操作在浏览器绘制后推迟并执行。但是有很多setTimeout
让我感觉不对劲。
所以我的问题是,对此有没有更好/更优雅的解决方案?
如果有人知道答案,我还有其他一些问题:
setTimeout(..., 0)
是否保证在浏览器绘制后代码将被执行? (在Vue.js中有一个nextTick()
帮助器来执行此操作)