Skip to content

$props 与绑定

$props 用于声明组件接收的属性(props)。它是 Svelte 5 中父子组件通信的核心。

基本用法

在 Svelte 5 里,props 用解构语法声明:

svelte
<!-- Answer.svelte -->
<script>
  let { answer } = $props();
</script>

<p>答案是 {answer}</p>
svelte
<!-- 父组件 -->
<script>
  import Answer from './Answer.svelte';
</script>

<Answer answer={42} />

对比 Svelte 4 的 export let answer$props() 用解构,更贴近普通 JavaScript,也更容易加默认值和类型。

默认值

直接在解构里给默认值:

svelte
<script>
  let { name = '访客', age = 18 } = $props();
</script>

<p>{name},{age} 岁</p>

收集剩余 props

用展开语法收集没显式声明的属性,常用于把它们透传给原生元素:

svelte
<script>
  let { children, ...rest } = $props();
</script>

<!-- rest 里的 class、id、onclick 等都会应用到 button 上 -->
<button {...rest}>
  {@render children?.()}
</button>

TypeScript 类型

给 props 加类型非常自然:

svelte
<script lang="ts">
  interface Props {
    title: string;
    count?: number;
  }
  let { title, count = 0 }: Props = $props();
</script>

<h2>{title}({count})</h2>

$bindable —— 双向绑定

默认情况下 props 是单向的:子组件不能修改它。如果希望父组件用 bind: 与子组件双向同步,就用 $bindable

svelte
<!-- VolumeControl.svelte -->
<script>
  // volume 可被父组件 bind,子组件内部也能修改它
  let { volume = $bindable(50) } = $props();
</script>

<input type="range" min="0" max="100" bind:value={volume} />
<span>{volume}</span>
svelte
<!-- 父组件 -->
<script>
  import VolumeControl from './VolumeControl.svelte';
  let volume = $state(50);
</script>

<!-- bind:volume 建立双向绑定 -->
<VolumeControl bind:volume />
<p>父组件里的音量:{volume}</p>

TIP

不带 bind: 时,$bindable(default) 里的 default 会作为初始值;子组件内部的修改不会传回父组件。带 bind: 时,两边的修改会实时同步。

试一试:$props + $bindable

拖动滑块,父组件里的 volume同步变化;点「静音」按钮,子组件的滑块也会跟着变 —— 这就是双向绑定:

双向绑定 · $bindableSvelte 5 · Live

对应源码(父组件):

svelte
<script>
  import VolumeControl from './VolumeControl.svelte';
  let volume = $state(50);
  let muted = $derived(volume === 0);
</script>

<VolumeControl bind:volume />

<button onclick={() => (volume = muted ? 50 : 0)}>
  {muted ? '取消静音' : '静音'}
</button>

试一试:$props 主题切换

下面这个组件用 $props 接收 theme$bindable)和 label(普通 prop 带默认值),点击即切换:

主题切换 · $props / $bindableSvelte 5 · Live

小结

要点说明
let { a, b } = $props()声明 props(解构语法)
= 默认值直接给默认值
...rest收集并透传剩余属性
: Props用 TypeScript 接口标注类型
$bindable(默认值)让 prop 支持父组件 bind: 双向绑定
取代Svelte 4 的 export let

下一步:Runes API 速查,或继续看组件基础

基于 VitePress 构建 · 示例使用 Svelte 5.57