svelte-multiselect Svelte MultiSelect

« home

Page-Reload Persistent MultiSelect

This example shows how to combine MultiSelect with sessionStorage to persist the selected state across page reloads.

<script>
  import MultiSelect from '$lib'
  import { languages } from '$site/options'
  import { LanguageSnippet } from '$site'
  import { onMount } from 'svelte'

  let selected = $state([])

  onMount(() => {
    const stored = sessionStorage[`languages`]
    selected = stored ? JSON.parse(stored) : `Python TypeScript C Haskell`.split(` `)
  })

  $effect(() => {
    if (sessionStorage) sessionStorage[`languages`] = JSON.stringify(selected)
  })
</script>

<MultiSelect
  options={languages}
  placeholder="What languages do you know?"
  bind:selected
>
  {#snippet selectedItem({ idx, option })}
    <LanguageSnippet {option} {idx} />
  {/snippet}
</MultiSelect>

Array Cloning Infinite Loop Prevention (Issue #309)

Tests that binding to reactive wrappers (Svelte stores, Superforms, etc.) that clone arrays on assignment doesn’t cause infinite loops. See issue #309.

Modified: 1 times

<script>
  import MultiSelect from '$lib'
  import { writable } from 'svelte/store'

  // Regression test for issue #309: store subscriptions would cause infinite
  // loops without the values_equal() fix in MultiSelect.svelte
  const options = [`Red`, `Green`, `Blue`]
  let increment = $state(0)
  let list_store = writable([])

  list_store.subscribe(() => increment++)
</script>

<MultiSelect {options} bind:selected={$list_store} placeholder="Select colors..." />
<p id="store-binding-status">
  Modified: {increment} times
  {#if increment > 50}⚠️ Regression!{:else if increment > 1}✅ Fixed{/if}
</p>