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

SolidJS v1.7.x使用setState报错:Uncaught TypeError: l is not iterable

问题原因及解决方法

你遇到的l is not iterable错误,根源是调用setState的方式不符合SolidJS Store的API规范。

核心错误点

createStore返回的setState函数不需要把state作为第一个参数传入。你之前的写法setState(state, l => [...l, ...])会把state当成路径参数解析,导致更新器函数的参数l并非当前的数组状态,自然无法被解构迭代。

分场景解决

场景1:Store本身是数组(createStore(list))

直接将更新器函数传给setState即可,更新器函数的参数就是当前的数组状态:

const setComplete = (e) => {
  setState(l => [...l, {id: props.toDo.id, data: props.toDo.data, status: 'complete'}]);
};

场景2:Store是包裹对象(createStore({stateList: list}))

需要指定要更新的路径(这里是stateList),再传入更新器函数:

const setComplete = (e) => {
  setState('stateList', l => [...l, {id: props.toDo.id, data: props.toDo.data, status: 'complete'}]);
};

或者通过函数式更新整个对象:

const setComplete = (e) => {
  setState(prev => ({
    ...prev,
    stateList: [...prev.stateList, {id: props.toDo.id, data: props.toDo.data, status: 'complete'}]
  }));
};

额外建议

如果你的需求是修改现有待办项的状态(而非新增一个complete项),可以通过数组映射找到对应id的项并更新状态,示例如下:

// Store为数组时的写法
const setComplete = (e) => {
  setState(l => l.map(item => 
    item.id === props.toDo.id ? {...item, status: 'complete'} : item
  ));
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:41:24