-
Notifications
You must be signed in to change notification settings - Fork 314
[v1.3] 显著提升 UI 响应速度 —— 修复 ArcoDesign/React 中 focusin / focusout 事件问题 #1224
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: release/v1.3
Are you sure you want to change the base?
[v1.3] 显著提升 UI 响应速度 —— 修复 ArcoDesign/React 中 focusin / focusout 事件问题 #1224
Conversation
|
如果是arco的问题,我觉得可以给arco提pr,让他们发新包更新一下,不过鉴于arco维护并不积极,可以临时这样处理一下 看代码感觉侵入性还是太强了 |
|
如果是arco的问题,我觉得可以给arco提pr,让他们发新包更新一下,不过鉴于arco维护并不积极,可以这样处理一下 |
Co-authored-by: wangyizhi <i@xloli.top>
老实说我也不知道是 React 问题 还是 ArcoDesign 问题 还是 ScriptCat 业务代码问题 |
|
加了注释。 |
|
应该只有 focusin/focusout 是否存在类似事件?存在,但真正值得像 focusin / focusout 这样采用 macrotask 延迟处理的同类事件非常少。 大多数问题集中在同时具备「同步冒泡 + 高频触发 + React/框架额外包装一层」特性的事件上。 以下按实际踩坑概率从高到低排序,而非罗列所有事件。 一、与 focusin / focusout 同级别(最需关注)1. focus / blur(
为何仍需关注?
但: 结论: 二、存在「同步连环触发」的高频 UI 事件(有一定风险)特点:一次用户操作 → 同步触发多个事件 → React/框架再次包装 2. mouseover / mouseout(次高风险)
为何通常没 focusin 那么严重?
结论: 3. pointerover / pointerout(🟡 现代且相对干净)
结论:基本无需特别担心。 三、真正的高频事件,但不适合用 macrotask 方案4. scroll / resize(🚫 不建议此方式)
若强行放入 macrotask:
推荐正确处理方式:
四、键盘与输入相关事件(需视场景而定)5. input / change / keydown / keyup在中文输入法(IME)场景下会产生: 一次输入可能导致原生 + React 多轮触发。 但这些事件语义极其敏感(光标位置、撤销栈、输入法交互等),延迟到 macrotask 极易引入 bug。 结论: 五、为何 focusin / focusout 尤其“特殊”?当前 macrotask 方案几乎是为它们量身定制,主要原因同时满足以下六点:
真正同时满足这六点的其他事件极少。 六、实战判断标准(Mental Checklist)未来遇到类似性能问题时,可快速对照以下条件: 只有同时满足全部条件的事件,才值得考虑 macrotask 延迟方案:
目前几乎仅限于:
|

React 16.14.0 -> React 17.0.0
经测试,会在 dom 加入这些事件
ArcoDesign 实际上只支持到 React 16.x (16.13.0)
所以没针对React >=17 作出优化?
( ArcoDesign 以 onFocus onBlur 作出发点,但实际上是用 focusin focusout)
( ScriptCat的设计,一个页面会有多个 tabIndex 项,所以 click 的时候会有这样的 focusin focusout ?)
(React 本身好像只會 anchor 在 div#root, 但 ArcoDesign 好像因為有Modal之類的會 anchor 在 body? 所以兩者互相衝突了? )
https://github.com/arco-design/arco-design/blob/72a881a37a5957d16021cf26d39e6e2e63b05021/package.json#L120-L121
我不知道是ArcoDesign本身的问题还是什么了
我估计它在初始化时会加一些 event 在 body 和 root
但它加了之后,在Re-render 时又再加一次
所以会有重复触发
在 ScriptList Table
有300个scripts
打勾一下
你会发现拖超慢
然后你看一下 DevTools, 会显示为 focusin focusout 超时
打印一下的话,会发现 focusin focusout 的 handler 一次打勾会执行 8次左右
现在加了这个 fix, 打勾要等一秒的情况就完全消失了 (打勾不会卡死在 focusin focusout)
整个体验快乐得多了 ...
screen-capture.25.online-video-cutter.com.-00.00.00.000-00.00.28.559.mp4