You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:31:39