Skip to content
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

[Feature Request] Support React18 #1832

Closed
1 task done
janryWang opened this issue Jul 19, 2021 · 10 comments
Closed
1 task done

[Feature Request] Support React18 #1832

janryWang opened this issue Jul 19, 2021 · 10 comments
Assignees
Labels
enhancement New feature or request

Comments

@janryWang
Copy link
Collaborator

janryWang commented Jul 19, 2021

  • I have searched the issues of this repository and believe that this is not a duplicate.

What problem does this feature solve?

目前看来,@formily/reactive-react面临和mobx一样的 "tearing" 问题,具体参考 mobxjs/mobx#3005

What does the proposed API look like?

API无需改动

@janryWang janryWang added the enhancement New feature or request label Jul 19, 2021
@janryWang janryWang self-assigned this Jul 19, 2021
@janryWang janryWang pinned this issue Jul 20, 2021
@janryWang
Copy link
Collaborator Author

janryWang commented Jul 20, 2021

Mobx和@formily/reactive在React18的concurrent mode模式,在极端情况下,会出现"tearing"问题,其实也就是视觉分割现象

核心是因为每个组件的状态源,与树层级没有做绑定导致的,因为reactive模式,数据与ui是一种弱关联模式,所以在CM模式下,React调度系统就感知不到某一批响应更新是属于一组共性更新,没法合并,只能一个任务接一个任务的去处理

也就是会导致,本身在同步模式渲染行为,比如a数据变化,n个组件依赖了a,会立即响应,但在CM模式下,是会一组一组的响应,这也许在某些对数字敏感度极高的产品上,会出现像bug的行为,不过在大多数场景下,这个分组更新,反而性能体验会更好

@janryWang
Copy link
Collaborator Author

janryWang commented Jul 20, 2021

React为了解决这种将状态与树层级绑定的问题,整了个useMutableSource来解决,可惜的是,它要求用户必须显示传递该组件引用了哪些数据源,这完全不适配reactive模式,因为reactive的绑定关系是不需要手动声明的,只需要依赖这份数据就会自动绑定,所以这也侧面反应了依赖useMutableSource的Recoil是很难做到数据粒度更细的响应式更新

@janryWang
Copy link
Collaborator Author

具体什么是"tearing",可以参考 reactwg/react-18#69

@franckchen
Copy link

franckchen commented Aug 20, 2021

想请教一下Mobx和concurrent Mode下的tearing是视觉上的tearing(体验不好,短暂时刻数据和实际渲染结果部分不一致)还是渲染结果的tearing(bug). 根据我对mobx的理解,tearing应该是视觉上的,不会有渲染结果的tearing的。代码写的正常的话, 会有render积压,但是最终渲染后还是会视图层和数据层完全一致的。所以这种tearing还好吧?在极端情况下,会出现"tearing"问题应该指代的也是视觉层面的吧?

@janryWang
Copy link
Collaborator Author

想请教一下Mobx和concurrent Mode下的tearing是视觉上的tearing(体验不好,短暂时刻数据和实际渲染结果部分不一致)还是渲染结果的tearing(bug). 根据我对mobx的理解,tearing应该是视觉上的,不会有渲染结果的tearing的。代码写的正常的话, 会有render积压,但是最终渲染后还是会视图层和数据层完全一致的。所以这种tearing还好吧?在极端情况下,会出现"tearing"问题应该指代的也是视觉层面的吧?

对,主要是视觉上的问题,至于是否会影响逻辑,还得等React18发布正式版验证了

@franckchen
Copy link

嗯啊。看了官方讨论贴,感觉目前mobx不存在最终渲染结果的tearing问题。

https://github.com/dai-shi/will-this-react-global-state-work-in-concurrent-rendering 中的例子里目前也没有发现最终渲染结果出错的tearing.

reactwg/react-18#70 中也提到了temporarily tear(UI短暂tearing, 最终渲染结果正确).目前看来绝大部分活跃的状态管理, 都解决了最终渲染结果的tearing.中间过程的temporarily tea还是存在的

目前理解还不够,准备持续调研

@muuyao muuyao unpinned this issue Sep 23, 2021
@kaoding
Copy link

kaoding commented Mar 30, 2022

React 18 发布了,可以搞起来了。

@ShaofeiZi
Copy link
Contributor

??? 我还以为已经支持了

@janryWang
Copy link
Collaborator Author

??? 我还以为已经支持了

目前升级18,暂时没发现啥大问题

@muzishuiji
Copy link

React为了解决这种将状态与树层级绑定的问题,整了个useMutableSource来解决,可惜的是,它要求用户必须显示传递该组件引用了哪些数据源,这完全不适配reactive模式,因为reactive的绑定关系是不需要手动声明的,只需要依赖这份数据就会自动绑定,所以这也侧面反应了依赖useMutableSource的Recoil是很难做到数据粒度更细的响应式更新

这个是不是应该理解为 Recoil很难做到动态的数据粒度更细的依赖收集,而不是做不到数据粒度更细粒度的响应式更新,因为显式的传递依赖的数据源,是可以正常更新的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

5 participants