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

SvelteKit绑定问题:departments变量被设为undefined

问题描述

在SvelteKit项目的+page.svelte中遇到值绑定异常:

  1. 页面加载后,data属性成功填充clients列表并渲染客户端选择下拉框;
  2. 用户选择客户端时,触发API调用获取对应部门数据,填充部门选择下拉框;
  3. 但用户选择部门后,departments变量被莫名设为undefined,导致部门下拉框消失;
  4. 移除部门下拉框的bind:value后问题不再出现,调换bind:value与on:change顺序无效。

原代码

<script>
export let data

let clientValue = 0
let departmentValue = 0

$: ({ clients, departments } = data)

async function handleClientSelection(event) {
    const response = await fetch('/api/departments/' + event.target.value)
    departments = await response.json()
}
async function handleDepartmentSelection(event) {
    console.log('handleDepartmentSelection called and did something.')
}
</script>

<label for='client'>Client: 
<select name="client" bind:value={clientValue} on:change={handleClientSelection}>
    <option value="0" disabled>Select a client</option>
    {#each clients as client}
        <option value={client.id}>{client.title}</option>
    {/each}
</select>
</label>

{#if departments !== undefined && departments !== null}
<label for='department'>Department: 
<select name="department" bind:value={departmentValue} on:change={handleDepartmentSelection}>
    <option value="" disabled>Select a department</option>
    {#each departments as department}
        <option value={department.id}>{department.title}</option>
    {/each}
</select>
</label>
{/if}
问题原因与解决方法

核心原因

问题出在反应式解构语句:

$: ({ clients, departments } = data)

这条语句会在组件每次更新时(比如用户选择部门导致departmentValue变化)重新执行,将departments重置为data中的初始值(大概率是undefined),直接覆盖了API获取的部门数据。

解决方法

移除反应式解构,直接初始化clients和departments变量,后续单独维护departments的状态:

修改后的<script>部分:

<script>
export let data

let clientValue = 0
let departmentValue = 0

// 直接从data初始化,不再使用反应式语句
let clients = data.clients;
let departments = data.departments;

async function handleClientSelection(event) {
    const response = await fetch('/api/departments/' + event.target.value)
    departments = await response.json()
}
async function handleDepartmentSelection(event) {
    console.log('handleDepartmentSelection called and did something.')
}
</script>

这样修改后,departments只会在API调用时被更新,不会被组件更新时的反应式语句重置,部门下拉框就能正常保持显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:32:40