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

SolidJS中createStore使用Map时变更不触发更新的问题求助

问题原因与解决方案

核心原因

SolidJS的createStore通过追踪对象属性的引用变化触发响应更新:

  • 使用数组时,若通过setState创建新数组实例(比如setState('items', arr => [...arr, newItem])),state.items的引用发生改变,组件能感知到变化并重新计算派生值。
  • Map是可变引用类型,直接修改Map内部条目(比如state.items.set(id, value))时,state.items的引用并未改变,createStore无法检测到内部变更,因此不会触发组件更新。

解决方法

方法1:替换整个Map实例

更新时创建新的Map,让state.items引用发生变化:

// 添加新条目时
setState('items', new Map(state.items).set(1, 'new item'));

方法2:使用produce工具(推荐)

从solid-js/store导入produce,它可以在修改集合内部结构的同时自动生成新的状态引用:

import { produce } from 'solid-js/store';

// 更新Map
setState(produce(state => {
  state.items.set(1, 'new item');
}));

方法3:改用数组存储(按需选择)

如果业务场景允许,将Map转换为数组结构(比如items: [{id: 1, value: 'xxx'}, ...]),createStore对数组的引用变化和长度变更有原生支持,能自动触发更新。

官方文档对应说明

SolidJS Store文档中不可变更新章节明确指出:store仅追踪属性引用的变化,对于Map、Set这类可变内置集合,直接修改内部值不会触发更新,必须通过替换引用或使用produce工具实现可追踪的变更。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:22:15