heluxjs/helux

[RFC] 提供启用/禁用派出计算的API` enableMutates(true/false)`

zhangfisher opened this issue · 4 comments

希望提供启用/禁用派出计算的I enableMutates(true/false)

希望

enableMutates用于临时开启/关闭派生计算

enableMutates(true)        // 启用派生计算
enableMutates(false)       // 禁用派生计算

应用场景

在开发基于helux的表单库时,有如下场景:

const formState={
       name:"",
      repo:"repoUrl",
      projects:computed(async (repoUrl)=>{
            return await getProject(repoUrl)
     },["repo"])
}

const form=createForm(state)

在上面中,projects是一个派生属性,是根据repo显示派生出来的。

当我提交表单后的数据,如下:

{
       name:"",
      repo:"http://zhangfisher.github.io",
      projects:["voerkai18n","flexstate"]
}

问题在于,当我重新加载表单时,此时有上次提交的数据,用来第一次显示

form.loadData({
       name:"",
      repo:"http://zhangfisher.github.io",
      projects:["voerkai18n","flexstate"]
})

由于repo值发生变化,会触发projects的重新计算,从而导致从远程加载的数据会覆盖原有的表单数据。

这显然是不对的,因为重新await getProject(repoUrl)得到的数据并不一定与我上次提交的projects一样。

因此,我需要一个API,当我要重新加载表单数据时enableMutates(false),禁止进行派生计算。
然后在表单渲染准备就绪后,再enableMutates(true)启用派生计算。

此时,如果repo发生变化产生的重新计算projects才是合理的。

只能禁止自动运行,不能禁止用户手动调用 runMutate强制运行

版本 >=3.5.22 起新增 setEnableMutate 设置 enableMutategetEnableMutate 获取 enableMutate

ctx.setEnableMutate(true); // 允许
ctx.setEnableMutate(false); // 禁用
ctx.setEnableMutate(!ctx.getEnableMutate()); // 切换

不好意思,考虑不周,这样还有点问题

const [_,_,ctx]=  share({})
ctx.setEnableMutate(false); // 禁用

这样禁用派生计算还是会导致先计算再禁用

更合理应该是,在创建share/atom时传入options.enableMutate更合理。

const [_,_,ctx]=  share({},{
       enableMutate:false   // 默认禁用更加合理
})

//然后数据准备完毕后调用
ctx.setEnableMutate(true)

另外,ctx.getEnableMutate()这个API应该不需要

因为应该允许通过ctx.options来访问所有配置参数。

版本 >=3.5.23 起支持生成 atom 时配置enableMutate( 默认为 true )

atom({}, { enableMutate: false })

可中途通过 setEnableMutate 反复开或关

ctx.setEnableMutate(true); // 允许
ctx.setEnableMutate(false); // 禁用
ctx.setEnableMutate(!ctx.getConfOptions().enableMutate);; // 切换