如何避免SolidJS中更新store变量时触发effect响应?
问题:避免SolidJS Effect因store中无关变量更新触发执行
我声明了如下Effect:
createEffect(async ()=>{ let localvar = 0; if(storeGetter.var1 && storeGetter.var2){ while(storeGetter.var3){ localvar = await storeGetter.someFunction1(storeSetter,storeGetter); } } })
同时在store中定义了someFunction1:
someFunction1: async function(setter,getter){ let localVar2 = 0; let ans = 0; if(getter.var_4){ /*do some calculations*/ } return ans; }
问题是:当store的var_4更新时,SolidJS会把它识别为Effect的依赖,导致Effect被触发执行。想知道怎么避免这种情况,不确定是否该用untrack以及如何在这个场景下使用。
解决方案
完全可以用SolidJS的untrack解决这个问题,它能让包裹的代码不被追踪依赖,具体有两种实现方式:
方式1:在Effect中调用someFunction1时用untrack包裹
直接在Effect里调用someFunction1的地方用untrack包裹,这样函数内部对var_4的访问就不会被添加到Effect的依赖列表:
import { untrack } from "solid-js"; createEffect(async ()=>{ let localvar = 0; if(storeGetter.var1 && storeGetter.var2){ while(storeGetter.var3){ // 用untrack隔绝内部依赖追踪 localvar = await untrack(() => storeGetter.someFunction1(storeSetter,storeGetter)); } } })
方式2:在someFunction1内部对var_4的访问用untrack包裹
如果希望所有调用someFunction1的场景都不追踪var_4,可以在函数内部包裹对var_4的读取逻辑:
import { untrack } from "solid-js"; someFunction1: async function(setter,getter){ let localVar2 = 0; let ans = 0; // 用untrack包裹var_4的读取,避免被外部追踪 if(untrack(() => getter.var_4)){ /*do some calculations*/ } return ans; }
两种方式都能达成目的:如果只是当前Effect不需要追踪var_4,选方式1;如果所有调用someFunction1的场景都不需要追踪,选方式2。
内容的提问来源于stack exchange,提问作者Typo
相关产品推荐
相关产品推荐

