-
Notifications
You must be signed in to change notification settings - Fork 2.7k
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
fix(useVirtualList): mutate style in react context #2034
Conversation
) |
确实能解决这个问题。我先合掉。 不过你说的 :
有什么资料可以参考么? |
抱歉我没有太了解 react dom 的工作机制,但是我发现在直接设置样式的 demo1 下,会有如下现象:
对于这个现象,我无法解释这个非预期的事件的原因; 但是设置样式时一般场景是在渲染周期中把样式写在 ReactEL 让 React 调度,而这个钩子设置样式是脱离了 React 周期走了 EventListener 回调,我觉得这样可能会导致和 react dom 的操作撞车,所以修改了此处,推迟到 Effect 再设置。 e.g.
|
@luo3house 你好,我最近在学习这个hooks的源码,也遇到这个问题了, 对于直接在calculateRange中设置样式导致闪动的问题您现在知道原因了吗,我也有疑问,为什么会有非预期的scroll事件产生呢? |
抱歉非常晚才回复,通过debugger我发现出现闪动的位置可能是0也可能是前一个虚拟视口的top,所以我猜想 reactdom 内部可能对 dom 做了缓存用作diff,此时脱离 react 生命周期直接修改 dom 及其属性可能会有非预期的问题产生,但是具体还是要看 reactdom 的工作流程。而类似虚拟滚动解决方案 react-vxxxxlist或者react-scxxxn 把计算后的属性交给用户渲染应更加对用户透明。钩子这样改有breaking change,所以先让操作跟生命周期看看情况。 |
原因应该是这个 但是感觉这样解没解完全 我这边还是回出现。 |
[中文版模板 / Chinese template]
🤔 This is a ...
🔗 Related issue link
fix #2033
💡 Background and solution
农历兔年快乐。
当滚动需要视野内数据变更时,钩子直接修改了 dom 中 wrapper 样式,因为这个回调不属于 React 的上下文,这可能破坏 React 一致性,出现频闪。
这个 PR 让钩子把计算好的 wrapper 样式存起来,在 Update Effect 中设置 wrapper 样式。
📝 Changelog
☑️ Self Check before Merge