命令式组件 API

在 Svelte 3 和 4 中,与组件交互的 API 与 Svelte 5 不同。注意,本页 适用于 Svelte 5 应用中处于 legacy 模式的组件。

创建组件

// @noErrors
const component = new Component(options);

客户端组件——即使用 generate: 'dom'(或留空 generate 选项)编译的组件——是一个 JavaScript 类。

// @noErrors
import App from './App.svelte';

const app = new App({
	target: document.body,
	props: {
		// 假设 App.svelte 中包含类似
		// `export let answer` 的内容:
		answer: 42
	}
});

可以提供以下初始化选项:

选项 默认值 描述
target 要渲染到的 HTMLElementShadowRoot。此选项为必填
anchor null target 的一个子节点,组件会紧接在其前面渲染
props {} 提供给组件的一个属性对象
context new Map() 提供给组件的一个根级 context 键值对 Map
hydrate false 见下文
intro false 如果为 true,会在初次渲染时播放过渡,而不是等到后续状态变化

target 已有的子节点会保持原样。

hydrate 选项指示 Svelte 升级已有的 DOM(通常来自服务端渲染),而不是创建新元素。它只有在组件是以 hydratable: true 选项 编译时才有效。对 <head> 元素的注水只有在服务端渲染代码同样以 hydratable: true 编译时才正常工作,这会给 <head> 中的每个元素添加一个标记,以便组件知道在注水时它负责移除哪些元素。

虽然 target 的子节点通常会保持原样,但 hydrate: true 会导致任何子节点被移除。因此,anchor 选项不能与 hydrate: true 同时使用。

已有的 DOM 无需与组件匹配——Svelte 会在过程中"修复"这些 DOM。

// @noErrors
import App from './App.svelte';

const app = new App({
	target: document.querySelector('#server-rendered-html'),
	hydrate: true
});

[!NOTE] 在 Svelte 5+ 中,请改用 mount

$set

// @noErrors
component.$set(props);

以编程方式为某个实例设置 props。component.$set({ x: 1 }) 等价于组件 <script> 块内部的 x = 1

调用此方法会为下一个微任务安排一次更新——DOM 不会 同步更新。

// @noErrors
component.$set({ answer: 42 });

[!NOTE] 在 Svelte 5+ 中,请改用 $state 来创建一个组件 props 并更新它

// @noErrors
let props = $state({ answer: 42 });
const component = mount(Component, { props });
// ...
props.answer = 24;

$on

// @noErrors
component.$on(ev, callback);

每当组件派发一个 event 时,都会调用 callback 函数。

会返回一个函数,调用它可以移除该事件监听器。

// @noErrors
const off = component.$on('selected', (event) => {
	console.log(event.detail.selection);
});

off();

[!NOTE] 在 Svelte 5+ 中,请改用回调 props

$destroy

// @noErrors
component.$destroy();

将组件从 DOM 中移除,并触发所有 onDestroy 处理函数。

[!NOTE] 在 Svelte 5+ 中,请改用 unmount

组件 props

// @noErrors
component.prop;
// @noErrors
component.prop = value;

如果组件是以 accessors: true 编译的,每个实例都会有对应于组件每个 props 的 getter 和 setter。设置一个值会导致 同步 更新,而非 component.$set(...) 默认引发的异步更新。

默认情况下,accessorsfalse,除非你是作为自定义元素编译的。

// @noErrors
console.log(component.count);
component.count += 1;

[!NOTE] 在 Svelte 5+ 中,这一概念已过时。如果你想让属性可以从外部访问,请将它们 export

服务端组件 API

// @noErrors
const result = Component.render(...)

与客户端组件不同,服务端组件在你渲染之后没有生命周期——它们的全部职责就是创建一些 HTML 和 CSS。正因如此,其 API 略有不同。

服务端组件暴露了一个 render 方法,可以用可选的 props 调用它。它返回一个带有 headhtmlcss 属性的对象,其中 head 包含所遇到的任何 <svelte:head> 元素的内容。

你可以使用 svelte/register 将 Svelte 组件直接导入 Node。

// @noErrors
require('svelte/register');

const App = require('./App.svelte').default;

const { head, html, css } = App.render({
	answer: 42
});

.render() 方法接受以下参数:

参数 默认值 描述
props {} 提供给组件的一个属性对象
options {} 一个选项对象

options 对象接受以下选项:

选项 默认值 描述
context new Map() 提供给组件的一个根级 context 键值对 Map
// @noErrors
const { head, html, css } = App.render(
	// props
	{ answer: 42 },
	// options
	{
		context: new Map([['context-key', 'context-value']])
	}
);

[!NOTE] 在 Svelte 5+ 中,请改用 render