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

SvelteKit添加条目后响应式函数中数组显示有内容但length为0的问题求助

SvelteKit添加条目后响应式函数中数组显示有内容但length为0的问题求助

我现在遇到一个SvelteKit的奇怪问题,想求助大家!先给大家说下我的项目背景:

这是一个展示建筑系统组件列表的应用,还支持添加新组件,数据库用的MongoDB。

项目里的关键文件逻辑:

  • +page.js:负责获取组件列表、定义表格结构,还会填充“lookup”列表(用来在页面显示文本而不是_id),最后把这些数据都放在data里返回。
  • page.svelte:使用<GenericListView>组件,传入data.rows.components,代码如下:
<div class="mt-2">
  Components
    <GenericListView
      definition="{data.subAssetDefinition}"
      data="{data.rows.components}"
      table="true"
      on:invalidate="{myInvalidate}"
    />
</div>
  • <GenericListView>:用来构建<table>,里面会循环数据渲染<TableRowTd>组件,代码是这样的:
{#each data as row}
  <tr on:click="{rowClick (row)}">
    {#each definition.tableFields as field}
      <TableRowTd
        {definition}
        {field}
        data="{row[field] || ''}"
      />
    {/each}
  </tr>
{/each}
  • <TableRowTd>:里面有个响应式的$:函数,作用是把传入的data(也就是_id)在对应的lookup列表里匹配,拿到对应的文本值,代码如下:
$: {
  displayValue = data;
  let fieldDef = definition.schema.find (el => el.name == field);

  if (data && fieldDef && fieldDef.listType) {
    console.log (`<TableRowTd> looking up list for field [${field}], table [${fieldDef.table}] , id [${data}]`)
    try {
      console.log (definition.lists)
      let list = undefined;

      /* EDIT - changed array.find() to for( ... */
      console.log (`definition.lists.length [${definition.lists.length}]`);
      for (let i=0, found=false; i < definition.lists.length && !found; i++) {
        console.log (`Checking`);
        console.log(definition.lists[i]);
        if (definition.lists[i].table === fieldDef.table) {
          list = definition.lists[i];
          found = true;
        }
      }

      if (list) {
        console.log (`found the list`)
        let row = list.data.find (el => el._id === data);
        if (row) {
          console.log (`found`)
          displayValue = row.value;
        }
      }
    } catch (err) {
      console.log('error on %s: %s', fieldDef.table, err.toString())
    }
  }
}

问题现象:

  • 页面初始加载的时候一切正常,lookup值都能正确显示出来:
    初始加载正常显示lookup值的组件列表截图
  • 当添加一条新条目后,invalidate事件被触发,+page.js里的load函数会重新调用。
  • 但这时候,<TableRowTd>里的响应式函数出现问题:控制台里能看到definition.lists数组是有内容的,但definition.lists.length却显示0!导致我没法把_id匹配成对应的文本,页面上就直接显示_id了:
    添加条目后显示_id的组件列表截图
  • 控制台日志里的情况更奇怪:明明能看到数组里有内容,但是length属性就是0:
    控制台日志显示数组有内容但length为0的截图

我真的搞不懂这是怎么回事了——数组明明能被console.log()输出出来,但我的代码就是拿不到它的length?感觉像是Svelte或者SvelteKit的响应式相关问题,而且行为还时有时无,我完全摸不着头绪,有没有大佬能帮我分析下?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:08:15