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.
-
背景
大家都知道,@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