Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
修复 React18 中使用 createRoot 渲染 Submenu 会闪烁
ant-design/ant-design#38534
2022-11-16.23.30.37.mov
关键代码最小化:
<Submenu key="sub_key" />
的显示条件是mode==="vertical"
&&openKeys.includes("sub_key")
点击
Collapsed(false->true)
时会发生以下渲染:mode="vertical"
,openKeys=["sub_key"]
,显示条件成立,出现 Submenu,mergedInlineCollapsed 的改变触发了 setMergedOpenKeys([])mode="vertical"
,openKeys=[]
,显示条件不成立,隐藏 Submenu为什么在
React17
不会出现闪烁:只有
React18
才有ReactDOM.createRoot
这个 api,使用该渲染 api 才会出现闪烁的问题,因为它有着并发的能力。经过调试也发现点击Collapsed(false->true)
在React17
与React18
的两个渲染 api 的渲染间隔有所不同(多次调试取大概平均值)可以看出 React17 的渲染是不间断的、同步的事务,一旦渲染开始,就不能被中断,
而 React18 在并发模式下整个渲染时间变长了,因为在并发的能力可以在渲染的过程中去做一些其他的事情
根据上面的原因可以修改成以下的形式,把 setInternalMode、setInternalInlineCollapsed、setMergedOpenKeys 放在同一个地方赋值,这样利用到了 React 的批处理能力,让 mode 与 openKeys 同步修改。