Skip to content

Commit 381707f

Browse files
Rich-Harrisgithub-actions[bot]
authored andcommitted
sync svelte docs
1 parent 2c14802 commit 381707f

File tree

4 files changed

+117
-10
lines changed

4 files changed

+117
-10
lines changed

apps/svelte.dev/content/docs/svelte/02-runes/05-$props.md

Lines changed: 77 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,29 @@ title: $props
55
The inputs to a component are referred to as _props_, which is short for _properties_. You pass props to components just like you pass attributes to elements:
66

77
```svelte
8+
<!--- file: App.svelte --->
89
<script>
910
import MyComponent from './MyComponent.svelte';
1011
</script>
1112
12-
/// file: App.svelte
1313
<MyComponent adjective="cool" />
1414
```
1515

1616
On the other side, inside `MyComponent.svelte`, we can receive props with the `$props` rune...
1717

1818
```svelte
19+
<!--- file: MyComponent.svelte --->
1920
<script>
2021
let props = $props();
2122
</script>
2223
23-
/// file: MyComponent.svelte
2424
<p>this component is {props.adjective}</p>
2525
```
2626

2727
...though more commonly, you'll [_destructure_](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) your props:
2828

2929
```svelte
30-
/// file: MyComponent.svelte
30+
<!--- file: MyComponent.svelte --->
3131
<script>
3232
let +++{ adjective }+++ = $props();
3333
</script>
@@ -40,11 +40,10 @@ On the other side, inside `MyComponent.svelte`, we can receive props with the `$
4040
Destructuring allows us to declare fallback values, which are used if the parent component does not set a given prop:
4141

4242
```js
43-
/// file: MyComponent.svelte
4443
let { adjective = 'happy' } = $props();
4544
```
4645

47-
> [!NOTE] Fallback values are not turned into reactive state proxies.
46+
> [!NOTE] Fallback values are not turned into reactive state proxies (see [Updating props](#Updating-props) for more info)
4847
4948
## Renaming props
5049

@@ -66,9 +65,8 @@ let { a, b, c, ...others } = $props();
6665

6766
References to a prop inside a component update when the prop itself updates — when `count` changes in `App.svelte`, it will also change inside `Child.svelte`. But the child component is able to temporarily override the prop value, which can be useful for unsaved ephemeral state ([demo](/playground/untitled#H4sIAAAAAAAAE6WQ0WrDMAxFf0WIQR0Wmu3VTQJln7HsIfVcZubIxlbGRvC_DzuBraN92qPula50tODZWB1RPi_IX16jLALWSOOUq6P3-_ihLWftNEZ9TVeOWBNHlNhGFYznfqCBzeRdYHh6M_YVzsFNsNs3pdpGd4eBcqPVDMrNxNDBXeSRtXioDgO1zU8ataeZ2RE4Utao924RFXQ9iHXwvoPHKpW1xY4g_Bg0cSVhKS0p560Za95612ZC02ONrD8ZJYdZp_rGQ37ff_mSP86Np2TWZaNNmdcH56P4P67K66_SXoK9pG-5dF5Z9QEAAA==)):
6867

69-
<!-- prettier-ignore -->
7068
```svelte
71-
/// file: App.svelte
69+
<!--- file: App.svelte --->
7270
<script>
7371
import Child from './Child.svelte';
7472
@@ -82,9 +80,8 @@ References to a prop inside a component update when the prop itself updates —
8280
<Child {count} />
8381
```
8482

85-
<!-- prettier-ignore -->
8683
```svelte
87-
/// file: Child.svelte
84+
<!--- file: Child.svelte --->
8885
<script>
8986
let { count } = $props();
9087
</script>
@@ -94,6 +91,77 @@ References to a prop inside a component update when the prop itself updates —
9491
</button>
9592
```
9693

94+
Prop variables are not automatically deeply reactive. What happens when mutating one of their properties depends on what the parent passed in. For example if the parent passed a non-reactive POJO as a prop, setting a property of that object in the child will not cause the component to update ([demo](/playground/untitled#H4sIAAAAAAAAE3VPS07DMBC9yshCaiuqBLYhjoQ4Q1eEReJOVIMztuJJBbJ8d-IkEqXQ5bx53yCo6VEU4kCs2eBR7EWnDXpRvAbBXy79EjDhK_PZucyf0XDC2sbjf7iyxEg82YjSq0E7rmqqWffODgwvJ22O0A22h02Wz9cq3TzVVOY_CioXrm3fUbEMQdmRuICHGCGvpiDGTxYFDyPG_Y3Cl_6_K199bpQ2yBDWBhBBwp0brPPb3Z-u7chsCSwpo9WHDNsdyApCMslzODUeyAJ23WSUsMUymyfBvYTHmmKcI2e9LyBcUmKKWyKulr_Fb2Z_SHPIAQAA)):
95+
96+
```svelte
97+
<!--- file: App.svelte --->
98+
<script>
99+
import Child from './Child.svelte';
100+
101+
let object = $state({count: 0});
102+
</script>
103+
104+
<Child {object} />
105+
```
106+
107+
```svelte
108+
<!--- file: Child.svelte --->
109+
<script>
110+
let { object } = $props();
111+
</script>
112+
113+
<button onclick={() => {
114+
// has no effect
115+
object.count += 1
116+
}}>
117+
clicks: {object.count}
118+
</button>
119+
```
120+
121+
However if the value passed in by the parent component is itself a deeply reactive state object, then it will be deeply reactive in the child, too ([demo](/playground/untitled#H4sIAAAAAAAAE3WQwU7DMBBEf2VlITUVVQLXkERC_YaeCIfE2aoujm3FGwqy_O_YcSug0KNnx7Nv1jHVjchKtlMkSOLANmwvJFpWvjhGnybOohD0s_PZmNy-o6So9Z3F_3SuFaGiEMMqyydhqGlVS2I0eiLYHoQcYD_pEVZ5sbzOX1dPwRaMEgl0f0ROUMOdpY4wc1zPikp48OvgqorvXFWlRJe-eCiawED4QaykaUa_udHl5-rfba4mN_pETHcB9RHVTNrY7C9gPxNpBVpxKfhb7bI11A24GFIUcBJSAu9mi0AHhKUo9Cj1CUjDbIbQP1rTpjzN72t4bJX3C8kSa8vLCZLFR4q0-eogr_4LN7sC9foBAAA=)):
122+
123+
```svelte
124+
<!--- file: App.svelte --->
125+
<script>
126+
import Child from './Child.svelte';
127+
128+
let object = $state({count: 0});
129+
</script>
130+
131+
<Child {object} />
132+
```
133+
134+
```svelte
135+
<!--- file: Child.svelte --->
136+
<script>
137+
let { object } = $props();
138+
</script>
139+
140+
<button onclick={() => {
141+
// will cause the count below to update
142+
object.count += 1
143+
}}>
144+
clicks: {object.count}
145+
</button>
146+
```
147+
148+
The fallback value of a prop not declared with `$bindable` is treated like a non-reactive POJO, and therefore also doesn't update the component when mutating its properties.
149+
150+
```svelte
151+
<!--- file: Child.svelte --->
152+
<script>
153+
let { object = { count = 0 } } = $props();
154+
</script>
155+
<button onclick={() => {
156+
// has no effect if the fallback value is used
157+
object.count += 1
158+
}}>
159+
clicks: {object.count}
160+
</button>
161+
```
162+
163+
In general, mutating props is discouraged, instead use callback props to make it easier to reason about state and changes to that state. If parent and child should share (and be allowed to mutate) the same object, then use the [$bindable]($bindable) rune.
164+
97165
## Type safety
98166

99167
You can add type safety to your components by annotating your props, as you would with any other variable declaration. In TypeScript that might look like this...

apps/svelte.dev/content/docs/svelte/03-template-syntax/05-await.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,12 @@ Similarly, if you only want to show the error state, you can omit the `then` blo
6868
<p>The error is {error}</p>
6969
{/await}
7070
```
71+
72+
> [!NOTE] You can use `#await` to render dynamic components with the help of the `import()` function:
73+
>
74+
> ```svelte
75+
> {#await import('./Component.svelte') then Component}
76+
> <Component.default />
77+
> {/await}
78+
> ```
79+

apps/svelte.dev/content/docs/svelte/07-misc/07-v5-migration-guide.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ If you wanted multiple UI placeholders, you had to use named slots. In Svelte 5,
376376
</main>
377377
378378
<footer>
379-
---<slot name="header" />---
379+
---<slot name="footer" />---
380380
+++{@render footer()}+++
381381
</footer>
382382
```

apps/svelte.dev/content/docs/svelte/98-reference/20-svelte.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,36 @@ type ComponentEvents<Comp extends SvelteComponent> =
556556

557557
</div>
558558

559+
## ComponentExports
560+
561+
Convenience type to get the properties that given component exports.
562+
563+
Example: Typing the `bind:this` for a component named `MyComponent`
564+
```
565+
<script lang="ts">
566+
import MyComponent from '$lib/component';
567+
let component: ComponentExports<typeof MyComponent> | undefined = undefined;
568+
<script>
569+
570+
<MyComponent bind:this={component} />
571+
```
572+
573+
<div class="ts-block">
574+
575+
```dts
576+
type ComponentExports<
577+
TComponent extends
578+
| Component<any, any>
579+
| typeof SvelteComponent<any>
580+
> = TComponent extends typeof SvelteComponent<any>
581+
? InstanceType<TComponent>
582+
: TComponent extends Component<any, infer TExports>
583+
? TExports
584+
: never;
585+
```
586+
587+
</div>
588+
559589
## ComponentInternals
560590

561591
Internal implementation details that vary between environments

0 commit comments

Comments
 (0)