Guest User

Untitled

a guest
Nov 6th, 2024
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. App.svelte
  2. ```svelte
  3. <script module lang="ts">
  4.     type MyCustomType = { id: number; name: string; }
  5. </script>
  6.  
  7. <script lang="ts">
  8.     import MyDropdown from "./MyDropdown.svelte";
  9.  
  10.     let items = [
  11.         { id: 1, name: "Car" },
  12.         { id: 2, name: "Boat" },
  13.         { id: 3, name: "Plane" },
  14.     ]
  15.  
  16.     let selectedValue: MyCustomType = $state(items[0]);
  17.    
  18.     let options = [
  19.         {label: "Option 1", value: items[0] },
  20.         {label: "Option 2", value: items[1] },
  21.         {label: "Option 3", value: items[2] },
  22.     ]
  23. </script>
  24.  
  25. <MyDropdown
  26.     bind:value={selectedValue}
  27.     computeHtmlValue={(value: MyCustomType) => String(value.id)}
  28.     options={options}
  29. />
  30.  
  31. <h1>Selected value: {JSON.stringify(selectedValue)}</h1>
  32. ```
  33.  
  34. MyDropdown.svelte
  35. ```svelte
  36. <!-- MyDropdown.svelte -->
  37.  
  38. <script module lang="ts">
  39.   type Item<T> = {
  40.     value: T;
  41.     label: string;
  42.   }
  43.  
  44.   type Props<T> = {
  45.     options: Array<Item<T>>;
  46.     value?: T;
  47.     onchange?: (newValue: T) => void;
  48.     computeHtmlValue?: (value: T) => string | undefined;
  49.   }
  50. </script>
  51.  
  52. <script generics="T">
  53.   let {
  54.     options = [],
  55.     value = $bindable(),
  56.     onchange = undefined,
  57.     computeHtmlValue = (value: T) => String(value)
  58.   }: Props<T> = $props();
  59.  
  60.   let selectedValue = $derived(computeHtmlValue(value));
  61.  
  62.   const handleChange = (newValue: string) => {
  63.     const selectedOption = options.find((opt) => computeHtmlValue(opt.value) === newValue);
  64.     value = selectedOption?.value;
  65.     onchange?.(value);
  66.   }
  67. </script>
  68.  
  69.  
  70. <select value={selectedValue} onchange={(e) => handleChange(e.target!.value)}>
  71.   {#each options as option, i}
  72.     <option value={computeHtmlValue(option.value)}>{option.label}</option>
  73.   {/each}
  74. </select>
  75. ```
Advertisement
Add Comment
Please, Sign In to add comment