Skip to content

模板语法

Svelte 的模板基于 HTML,扩展了插值、条件、列表、绑定等语法。本章速览最常用的模板特性。

文本插值 {}

用花括号插入表达式:

svelte
<script>
  let name = $state('Svelte');
  let version = $state(5);
</script>

<p>你好 {name},当前大版本 {version}</p>
<p>计算:{version * 2}</p>
<p>大写:{name.toUpperCase()}</p>

插值里可以是任意合法的 JavaScript 表达式。

HTML 内容 {@html}

默认情况下插值会被转义。要渲染原始 HTML,用 {@html}

svelte
<script>
  let html = $state('<em>斜体</em>');
</script>

<!-- 显示字面量 <em>斜体</em> -->
<p>{html}</p>

<!-- 渲染成真正的斜体 -->
<p>{@html html}</p>

安全提醒

不要对用户输入使用 {@html},可能导致 XSS 攻击。仅用于可信内容。

属性绑定

普通属性

svelte
<img src={imageUrl} alt={description} />
<button disabled={!canSubmit}>提交</button>

布尔属性可直接写属性名(值为 true):

svelte
<button disabled>禁用</button>

展开属性

用一个对象一次性设置多个属性:

svelte
<script>
  let props = $state({ type: 'text', placeholder: '请输入', name: 'field' });
</script>

<input {...props} />

双向绑定 bind:

绑定表单元素

svelte
<script>
  let text = $state('');
  let checked = $state(false);
</script>

<input bind:value={text} />
<label>
  <input type="checkbox" bind:checked={checked} /> 同意
</label>

<p>输入了:{text},勾选:{checked}</p>

绑定内联样式

svelte
<script>
  let color = $state('#ff3e00');
  let size = $state(16);
</script>

<p style:color style:font-size="{size}px">彩色文字</p>
<input type="color" bind:value={color} />

style:属性名={值} 直接设置单个内联样式。

条件渲染 {#if}

svelte
<script>
  let score = $state(85);
</script>

{#if score >= 90}
  <p>优秀</p>
{:else if score >= 60}
  <p>及格</p>
{:else}
  <p>不及格</p>
{/if}

列表渲染 {#each}

svelte
<script>
  let items = $state(['苹果', '香蕉', '橙子']);
</script>

<ul>
  {#each items as item, index (item)}
    <li>{index}: {item}</li>
  {/each}
</ul>
  • as item, index —— 拿到元素和索引
  • (item) —— key,用于高效更新列表(强烈建议提供唯一 key)

带空状态的 {#each}

svelte
{#each items as item}
  <li>{item}</li>
{:else}
  <li>列表为空</li>
{/each}

异步内容 {#await}

svelte
<script>
  let promise = $state(fetchData());
</script>

{#await promise}
  <p>加载中…</p>
{:then data}
  <p>拿到数据:{data}</p>
{:catch error}
  <p>出错了:{error.message}</p>
{/await}

关键块 {#key}

当某个值变化时,强制重新创建其内部内容:

svelte
{#key currentId}
  <div>currentId 变化时,这里会重建(可用于重播动画)</div>
{/key}

试一试

下面的组件综合用到了 {#each}{:else}style:widthbind:value 等模板语法 —— 就是那个待办清单:

待办清单 · 综合实战Svelte 5 · Live

小结

语法作用
{expr}插值(自动转义)
{@html expr}渲染原始 HTML(慎用)
attr={v} / {...obj}属性 / 展开属性
bind:value双向绑定表单
style:prop={v}内联样式
{#if} / {:else if}条件渲染
{#each ... as x (key)}列表渲染
{#await}异步渲染
{#key}值变化时重建

下一步:Snippets 与 Slots —— 更强大的内容分发。

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