6.3 KiB
						
					
					
				
			
		
		
	
	| title | 
|---|
| Imperative component API | 
In Svelte 3 and 4, the API for interacting with a component is different than in Svelte 5. Note that this page does not apply to legacy mode components in a Svelte 5 application.
Creating a component
// @noErrors
const component = new Component(options);
A client-side component — that is, a component compiled with generate: 'dom' (or the generate option left unspecified) is a JavaScript class.
// @noErrors
import App from './App.svelte';
const app = new App({
	target: document.body,
	props: {
		// assuming App.svelte contains something like
		// `export let answer`:
		answer: 42
	}
});
The following initialisation options can be provided:
| option | default | description | 
|---|---|---|
| target | none | An HTMLElementorShadowRootto render to. This option is required | 
| anchor | null | A child of targetto render the component immediately before | 
| props | {} | An object of properties to supply to the component | 
| context | new Map() | A Mapof root-level context key-value pairs to supply to the component | 
| hydrate | false | See below | 
| intro | false | If true, will play transitions on initial render, rather than waiting for subsequent state changes | 
Existing children of target are left where they are.
The hydrate option instructs Svelte to upgrade existing DOM (usually from server-side rendering) rather than creating new elements. It will only work if the component was compiled with the hydratable: true option. Hydration of <head> elements only works properly if the server-side rendering code was also compiled with hydratable: true, which adds a marker to each element in the <head> so that the component knows which elements it's responsible for removing during hydration.
Whereas children of target are normally left alone, hydrate: true will cause any children to be removed. For that reason, the anchor option cannot be used alongside hydrate: true.
The existing DOM doesn't need to match the component — Svelte will 'repair' the DOM as it goes.
/// file: index.js
// @noErrors
import App from './App.svelte';
const app = new App({
	target: document.querySelector('#server-rendered-html'),
	hydrate: true
});
[!NOTE] In Svelte 5+, use
mountinstead
$set
// @noErrors
component.$set(props);
Programmatically sets props on an instance. component.$set({ x: 1 }) is equivalent to x = 1 inside the component's <script> block.
Calling this method schedules an update for the next microtask — the DOM is not updated synchronously.
// @noErrors
component.$set({ answer: 42 });
[!NOTE] In Svelte 5+, use
$stateinstead to create a component props and update that// @noErrors let props = $state({ answer: 42 }); const component = mount(Component, { props }); // ... props.answer = 24;
$on
// @noErrors
component.$on(ev, callback);
Causes the callback function to be called whenever the component dispatches an event.
A function is returned that will remove the event listener when called.
// @noErrors
const off = component.$on('selected', (event) => {
	console.log(event.detail.selection);
});
off();
[!NOTE] In Svelte 5+, pass callback props instead
$destroy
// @noErrors
component.$destroy();
Removes a component from the DOM and triggers any onDestroy handlers.
[!NOTE] In Svelte 5+, use
unmountinstead
Component props
// @noErrors
component.prop;
// @noErrors
component.prop = value;
If a component is compiled with accessors: true, each instance will have getters and setters corresponding to each of the component's props. Setting a value will cause a synchronous update, rather than the default async update caused by component.$set(...).
By default, accessors is false, unless you're compiling as a custom element.
// @noErrors
console.log(component.count);
component.count += 1;
[!NOTE] In Svelte 5+, this concept is obsolete. If you want to make properties accessible from the outside,
exportthem
Server-side component API
// @noErrors
const result = Component.render(...)
Unlike client-side components, server-side components don't have a lifespan after you render them — their whole job is to create some HTML and CSS. For that reason, the API is somewhat different.
A server-side component exposes a render method that can be called with optional props. It returns an object with head, html, and css properties, where head contains the contents of any <svelte:head> elements encountered.
You can import a Svelte component directly into Node using svelte/register.
// @noErrors
require('svelte/register');
const App = require('./App.svelte').default;
const { head, html, css } = App.render({
	answer: 42
});
The .render() method accepts the following parameters:
| parameter | default | description | 
|---|---|---|
| props | {} | An object of properties to supply to the component | 
| options | {} | An object of options | 
The options object takes in the following options:
| option | default | description | 
|---|---|---|
| context | new Map() | A Mapof root-level context key-value pairs to supply to the component | 
// @noErrors
const { head, html, css } = App.render(
	// props
	{ answer: 42 },
	// options
	{
		context: new Map([['context-key', 'context-value']])
	}
);
[!NOTE] In Svelte 5+, use
renderinstead