Replies: 4 comments 3 replies
-
|
这么做的一个目的主要就是为了让formily x-reactions具备更强大的逻辑编写能力,而不仅仅只是一个数据消费方 |
Beta Was this translation helpful? Give feedback.
-
|
大家开发formily大部分都是纯源码模式开发,如果x-reactions搞不定的,在外面随便处理一下就行了,我这边其实需求来源是设计器,设计器需要一个有逻辑闭环的能力 |
Beta Was this translation helpful? Give feedback.
-
formily我的观点是
designable这一块我还没有真正意义上的使用过,不过我觉得这可能是一个很好的能力,能省去很多自定义组件的封装。 |
Beta Was this translation helpful? Give feedback.
-
|
有必要手动声明依赖吗 并且这个是在具体的reaction上面挂载持久的observable吧 autorun(self => { |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
背景
大家都知道,@formily/reactive是比Mobx支持了更多能力的,最直接的就是,用户可以在autorun中既响应数据,又能操作数据,也就是说,autorun本身就是一个状态机模型了,但是,有一个问题,我们光有响应和操作,却没有创建,那就无法实现更复杂的逻辑了,因为autorun本身是会无限重复执行的函数体,就跟React渲染函数一样,那如何实现在autorun没被销毁前的持久引用创建呢?
Reactive方案
其实完全可以参考一下React的useMemo,我们也可以提供类似的API:
autorun.memo就作为一个持久引用创建方法,只有autorun本身被dispose或者memo依赖的参数发生变化的时候才会重新创建引用
那么,我们这里就解决了引用创建的问题。不过我们需要注意,memo函数内部是不会track数据的,要track数据必须基于dependencies数组来追踪
但是,另一个问题,memo是autorun同步执行的,也就是说它内部的计算会阻塞当前autorun流程,那如果我们希望有一个无阻塞模式呢?
同样可以参考React的useEffect,我们也可以提供类似的API:
这样就解决了在Autorun过程中,从创建数据,到响应数据,再到操作数据,同时操作数据还能支持异步或者复杂计算的能力
对于用memo创建observable对象的语法比较繁琐,我们还能进一步优化,可以这样:
Schema方案
根据以上方案,我们其实可以在Schema协议中透出几个内置变量,
$observable/$memo/$effect考虑到Schema场景上,比如用户想在onSearch/onFocus或者其他事件中操作数据,我们还能再提供一个
$props函数方便让x-reactions更好的与组件自身事件做通讯其实$props就是
Beta Was this translation helpful? Give feedback.
All reactions