Skip to content

Svelte Example: Batching

<script lang="ts">
  import { QueryClient, QueryClientProvider } from '@tanstack/svelte-query'
  import { SvelteQueryDevtools } from '@tanstack/svelte-query-devtools'
  import Characters from './lib/Characters.svelte'

  const queryClient = new QueryClient({
    defaultOptions: {
      queries: {
        retry: 0,
      },
    },
  })

  let ids = $state<Array<number>>([])
  let idsToLoad = $state<Array<number>>([])
  let error = $state('')

  const handleInput = (value: string) => {
    const parsedIds = value.split(',').map((id) => id.trim())

    if (parsedIds.every((id) => /^\d+$/.test(id))) {
      ids = parsedIds.map(Number)
      error = ''
    } else {
      error = 'Invalid.. only use numbers and comma'
    }
  }
</script>

<QueryClientProvider client={queryClient}>
  <div class="App">
    <h2>Character fetcher</h2>
    <div>
      <label for="ids" style="display: block">
        Character ids (numeric, comma separated)
      </label>
      <input
        id="ids"
        style="display: inline-block"
        placeholder="ids"
        oninput={(event) => handleInput(event.currentTarget.value)}
      />
    </div>

    {#if error}
      <h3 style="color: red">{error}</h3>
    {/if}

    <button
      type="button"
      disabled={!!error}
      onclick={() => {
        idsToLoad = ids
      }}
    >
      Load characters
    </button>
    <div>
      <h4 style="text-align: left">Characters:</h4>
      <Characters ids={idsToLoad} />
    </div>
  </div>
  <SvelteQueryDevtools initialIsOpen />
</QueryClientProvider>