Svelte 绑定选择值未在获取时更新

Posted

技术标签:

【中文标题】Svelte 绑定选择值未在获取时更新【英文标题】:Svelte binded select value is not updating on fetch 【发布时间】:2021-05-16 11:25:18 【问题描述】:

我在 Svelte (3) 中使用以下代码从 API 中获取选项。随后的 s 取决于第一个。我的期望是 selectedOption 会在选择填充其选项时更改为 options[0] 但直到我手动选择另一个选项然后选择第一个选项之前它不会改变。我绑定错了吗? AFAIK 我不需要反应变量,理论上应该像这样工作。

onmount(async () => 
    options = await getOptions()
)
let selectedOption;

<select bind:value=selectedOption>
#each options as option
    <option value=option selected=selectedOption === option>
        option.name
    </option>
/each

【问题讨论】:

【参考方案1】:

在 select 上使用 bind:value 只会在更改事件触发时更新绑定的变量。由于填充选项不会触发更改事件,因此在您选择选项之前,selectedOption 不会更新。

我建议在完全填充选项之前不要渲染&lt;select&gt;。这将确保立即设置 selectedOption

#if options.length > 0
    <select bind:value=selectedOption >
        #each options as option
                <option value=option selected=selectedOption === option>
                        option.name
                </option>
        /each
    </select>
/if

【讨论】:

对不起,我应该在我的问题上添加这个,但我确实在模板中有一个条件,但这可能是错误的,因为我正在做 #if options 而不是 #if options .length > 0 这可能会让事情变得不稳定。 options 初始化为什么?如果它为 null 或未定义,则 #if options 将为 false。如果它是一个空数组,那么 #if options 将为真,&lt;select&gt; 将在选项完全填充之前呈现。【参考方案2】:

如果你在 getOptions() 函数完成执行后实例化 selectedOption。您还应该将selected 设为 0 索引选项。

let selectedOption;

onmount(async () => 
    options = await getOptions()
    selectedOption = options[0]
)

<select bind:value=selectedOption>
#each options as option
    <option value=option selected=option.id == 0>
        option.name
    </option>
/each

【讨论】:

以上是关于Svelte 绑定选择值未在获取时更新的主要内容,如果未能解决你的问题,请参考以下文章

由于缺少引号,布尔值未在 MERN 堆栈中更新

IBInspectable 属性值未在 xib 中更新

反应:useContext 值未在嵌套函数中更新

文本字段更改的值未在 OnSubmit 中更新 - React-Hook-Form 和 React Js

输入值未在我传入 Intents 的另一个活动中更新

Python:函数返回的值未在熊猫数据框中更新