-
-
Notifications
You must be signed in to change notification settings - Fork 4.7k
Open
Description
Describe the bug
Components in Svelte 5 are functions so it should be pretty straight forward to make a curried (partial) component (with some props pre-populated).
Doing the below implementation works perfectly for the component creation. However the partial components do not react for props changes (change the size in the input).
Where is the problem?
<!-- Button.svelte -->
<script>
let { children, color, size } = $props();
</script>
<button style:border-width={size + "px"} style:border-color={color}>{@render children()}</button>// buttons.ts
import type { Component, ComponentInternals, ComponentProps } from "svelte";
import Button from "./Button.svelte"
function partial<T extends Component<any>>(component: T, partialProps: Partial<ComponentProps<T>>) {
return (anchor: ComponentInternals, props: ComponentProps<T>) => {
return component(anchor, { ...partialProps, ...props })
}
}
export const GreenButton = partial(Button, {color: 'green'});
export const RedButton = partial(Button, {color: 'red'});then
<script>
<script lang="ts">
import Button from "./Button.svelte";
import { RedButton, GreenButton } from "./buttons";
let size = $state(4);
</script>
<Button color="blue" {size}>White</Button>
<Button color="green" {size}>Green</Button>
<Button color="red" {size}>Red</Button>
<RedButton {size}>Red button</RedButton>
<GreenButton {size}>Green button</GreenButton>
<input bind:value={size} />
</script>Reproduction
https://svelte.dev/playground/88ba3c73bba646da95a3d11082c3a05c?version=latest
Logs
System Info
System:
OS: Linux 6.14 Arch Linux
CPU: (8) x64 11th Gen Intel(R) Core(TM) i7-11390H @ 3.40GHz
Memory: 17.90 GB / 31.08 GB
Container: Yes
Shell: 5.9 - /usr/bin/zsh
Binaries:
Node: 24.1.0 - /usr/bin/node
Yarn: 1.22.22 - /usr/bin/yarn
npm: 11.4.1 - /usr/bin/npm
pnpm: 10.11.1 - /usr/bin/pnpm
Browsers:
Chromium: 137.0.7151.68
npmPackages:
svelte: ^5.33.19 => 5.33.19Severity
annoyance
dixslyf and TheCymaeraTheCymaera
Metadata
Metadata
Assignees
Labels
No labels