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

Svelte中无法访问Map类型Store中的值

Svelte中无法访问Map类型Store中的值

我太懂你遇到的这个坑了!用Map作为Svelte store的时候,{#each}明明循环次数和Map里的元素数一致,但就是拿不到对象里的name、age这些属性对吧?

问题出在Map的迭代器特性上:当你直接在{#each}里用$items的时候,它迭代出来的不是单个的值对象,而是一个个[键名, 值对象]的数组。你之前的代码里直接访问item.name,相当于在数组上找name属性,自然拿不到结果。

给你几个实用的解决办法:

方法一:只迭代Map的值

把Map转换成值的数组,用Array.from($items.values())就能直接拿到所有值对象:

<script>
    import {items} from "./store.js"

    $items.set("one", { name: "John", age: 50 })
    $items.set("two", { name: "Jack", age: 25 })
</script>

<h1>Hello!</h1>
{#each Array.from($items.values()) as item}
    <div>name: {item.name}</div>
{/each}

方法二:同时获取键和值

如果需要用到Map的键名,可以直接解构迭代出来的键值对数组:

{#each $items as [key, item]}
    <div>键名:{key},姓名:{item.name}</div>
{/each}

方法三:派生一个值数组的Store(进阶)

如果你的组件经常需要用到Map里的值数组,可以在store里派生一个只读store,避免每次都手动转换:

// store.js
import {writable, derived} from "svelte/store"

const items = writable(new Map())
// 派生一个只存值数组的store
export const itemValues = derived(items, $items => Array.from($items.values()))
export {items}

然后在组件里直接用这个派生store:

<script>
    import {items, itemValues} from "./store.js"

    $items.set("one", { name: "John", age: 50 })
    $items.set("two", { name: "Jack", age: 25 })
</script>

<h1>Hello!</h1>
{#each $itemValues as item}
    <div>name: {item.name}</div>
{/each}

试试上面的方法,应该就能正常访问到Map里的值啦!

备注:内容来源于stack exchange,提问作者Manny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:17:58