Svelte:显示和隐藏复选框时的分组复选框绑定问题

Svelte: grouped checkbox binding problem when showing and hiding checkboxes

这个问题最好用一个实际的例子来说明。

<script>
    let searchInput = '';
    let values = ['a', 'b', 'c', 'd', 'e', 'f'];
    $: filteredValues = searchInput ? values.filter(v => v.toLowerCase().includes(searchInput.toLowerCase())) : values;
    
    let chosenValues = [];
</script>

<input type="search" placeholder="Search" bind:value={searchInput} />

{#each filteredValues as value (value)}
    <div class="checkbox">
        <input type="checkbox" bind:group={chosenValues} value={value} />
        {value}
  </div>
{/each}

{chosenValues}

也可在 REPL 上使用:https://svelte.dev/repl/5af87332d81e4d82835bcd0f47ff9d81?version=3.44.1

出现问题如下:

  1. 你select选项a和b
  2. 你搜索c
  3. 你select选项c

现在chosenValues只有c; a和b不见了。我想我可以遍历所有 values 并隐藏那些不属于 hiddenValues 的部分,这样它们仍然是 DOM 的一部分,但为什么会发生这种情况,而且是有更简单的方法来处理这个问题吗?

发生这种情况是因为 bind:group 只会考虑实际呈现的输入,正如您所说,一种选择是遍历所有值并使用一些 css 隐藏不可见的值。

另一种选择是自行处理绑定。

<script>
 let chosenValues = []
 function handleChange(ev) {
   const { checked, value } = ev.target
   if (checked) {
     chosenValues = [...chosenValues, value]
   } else {
     chosenValues = chosenValues.filter(v => v !== value)
   }
 }
</script>

{#each ....}
  <input {value} checked={chosenValues.includes(value)} on:change={handleChange}>
{/each}