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

Svelte子组件返回数组无法访问首个元素问题排查

无法访问Svelte子组件返回数组的索引问题

我刚接触Svelte,怀疑遇到的是JavaScript相关问题。子组件通过父组件传入的URL获取JSON对象并返回,接收该对象后,我尝试访问数组索引0对应的元素值,却出现错误:Cannot read properties of undefined (reading '0')。去掉索引后能在控制台正常打印完整数组,但始终无法显示单个元素。我还尝试使用自定义fetchStore函数,结果问题依旧,相关代码如下:

import fetchStore from './fetch.js'
const [data, loading, error, get] = fetchStore(url)
$: console.log($data.results[0].name);
import { writable } from 'svelte/store'

export default function (url) {
    const loading = writable(false)
    const error = writable(false)
    const data = writable({})
    
    async function get() {
        loading.set(true)
        error.set(false)
        try {
            const response = await fetch(url)
            data.set(await response.json())
        } catch(e) {
            error.set(e)
        }
        loading.set(false)
    }
    
    get()
    
    return [ data, loading, error, get]
}

问题原因

这是因为初始渲染时数据还未加载完成:

  • fetchStore初始化时把data设为了空对象{},此时$data.results是undefined,直接访问[0]就会抛出Cannot read properties of undefined错误。
  • 后续请求完成后data会被更新为包含results数组的对象,但初始渲染阶段的代码已经执行过一次,导致报错。

解决方法

你可以通过以下几种方式避免这个错误:

  • 使用可选链操作符:
    直接在访问属性时添加?.,当属性不存在时会返回undefined而不报错:

    $: console.log($data.results?.[0]?.name);
    
  • 结合loading状态判断:
    利用fetchStore返回的loading状态,只有在数据加载完成后再访问数组元素:

    $: if (!$loading && $data.results) {
        console.log($data.results[0].name);
    }
    
  • 初始化data时设置默认的results数组:
    修改fetchStore中data的初始值,给results一个空数组,避免初始时results为undefined:

    const data = writable({ results: [] })
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:10:52