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

SolidJS setStore 未仅修改指定路径,而是作用于所有属性

SolidJS Store回调被全局应用的问题排查与修复

尝试在SolidJS的store中为指定Action对象设置回调引用时,发现回调并未仅作用于目标对象,而是被应用到了store中所有路径相似的Action对象上。

相关代码

注册回调的函数:

const registerActionCallback = (
    on: 'Use' | 'Combo',
    actionName: string,
    cbKey: string,
    cb: (fns: ControllerActionFns) => void
) => {
    setState(
        'actionPool', // Record<string, Action>
        actionName, // string
        `on${on}Callbacks`, // Record<string, fn>, property of Action object
        cbKey,
        (_: (fns: ControllerActionFns) => void) => cb
    );
};

示例状态定义:

const [state, setState] = createStore({
    actionPool: {
        A: {...},
        ...,
        M: {
            ...,
            onUseCallbacks: {} // initially empty
            onComboCallbacks: {} // initially empty
            ...,
        },
        ...,
        Z: {...},
    },
    ...,
});

需求与问题现象

需求是:作为按钮的各个Action被点击时,执行自身onUseCallbacks或onComboCallbacks中存储的回调(用对象存储是为了方便注销)。

比如为Action M的Use事件注册名为'testCB'的回调,调用代码如下:

setState('actionPool', 'M', 'onUseCallbacks', 'testCB', () => () => console.log('hello'))

预期只有点击Action M对应的按钮时打印'hello',但实际点击actionPool中A到Z的任意按钮都会触发该打印。此前多次以类似方式使用SolidJS store从未遇到问题,这是首次尝试存储回调。

回调调用方式

将被点击的Action引用传入fireAction函数,执行以下逻辑:

for (const key in action.onUseCallbacks) 
    action.onUseCallbacks[key]();

修复方案

问题与SolidJS无关,是生成Action对象的原型实现存在漏洞——所有Action对象的onUseCallbacks和onComboCallbacks都引用了同一个对象。重写原型实现后,功能恢复正常。

内容的提问来源于stack exchange,提问作者George Maharishi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:32:35