[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
设置 enableMutate
, getEnableMutate
获取 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);; // 切换