--- title: 'Client-side component API' --- ## Creating a component ```ts // @errors: 2554 // @filename: ambient.d.ts import { SvelteComponent, ComponentConstructorOptions } from 'svelte'; declare global { class Component extends SvelteComponent {} var options: ComponentConstructorOptions<Record<string, any>>; } // @filename: index.ts // @errors: 2554 // ---cut--- 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. ```ts // @errors: 2554 // @filename: ambient.d.ts import { SvelteComponent, ComponentConstructorOptions } from 'svelte'; declare module './App.svelte' { class Component extends SvelteComponent {} export default Component; } // @filename: index.ts // @errors: 2554 // ---cut--- 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 `HTMLElement` or `ShadowRoot` to render to. This option is required | | `anchor` | `null` | A child of `target` to render the component immediately before | | `props` | `{}` | An object of properties to supply to the component | | `context` | `new Map()` | A `Map` of 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](/docs/svelte-compiler#compile). 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. ```ts /// file: index.js // @filename: ambient.d.ts import { SvelteComponent, ComponentConstructorOptions } from 'svelte'; declare module './App.svelte' { class Component extends SvelteComponent {} export default Component; } // @filename: index.ts // @errors: 2322 2554 // ---cut--- import App from './App.svelte'; const app = new App({ target: document.querySelector('#server-rendered-html'), hydrate: true }); ``` ## `$set` ```ts // @filename: ambient.d.ts import { SvelteComponent, ComponentConstructorOptions } from 'svelte'; declare global { class Component extends SvelteComponent {} var component: Component; var props: Record<string, any>; } export {}; // @filename: index.ts // ---cut--- 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. ```ts // @filename: ambient.d.ts import { SvelteComponent, ComponentConstructorOptions } from 'svelte'; declare global { class Component extends SvelteComponent {} var component: Component; } export {}; // @filename: index.ts // ---cut--- component.$set({ answer: 42 }); ``` ## `$on` ```ts // @filename: ambient.d.ts import { SvelteComponent, ComponentConstructorOptions } from 'svelte'; declare global { class Component extends SvelteComponent {} var component: Component; var ev: string; var callback: (event: CustomEvent) => void; } export {}; // @filename: index.ts // ---cut--- 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. ```ts /// file: index.js // @filename: ambient.d.ts import { SvelteComponent, ComponentConstructorOptions } from 'svelte'; declare global { class Component extends SvelteComponent {} var component: Component; } export {}; // @filename: index.ts // ---cut--- const off = component.$on('selected', (event) => { console.log(event.detail.selection); }); off(); ``` ## `$destroy` ```js // @filename: ambient.d.ts import { SvelteComponent, ComponentConstructorOptions } from 'svelte'; declare global { class Component extends SvelteComponent {} var component: Component; } export {} // @filename: index.ts // ---cut--- component.$destroy(); ``` Removes a component from the DOM and triggers any `onDestroy` handlers. ## Component props ```js // @filename: ambient.d.ts import { SvelteComponent, ComponentConstructorOptions } from 'svelte'; declare global { class Component extends SvelteComponent {} var component: Component; } export {} // @filename: index.ts // @errors: 2339 // ---cut--- component.prop; ``` ```js // @filename: ambient.d.ts import { SvelteComponent, ComponentConstructorOptions } from 'svelte'; declare global { class Component extends SvelteComponent {} var component: Component; var value: unknown; } export {} // @filename: index.ts // @errors: 2339 // ---cut--- 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. ```js /// file: index.js // @filename: ambient.d.ts import { SvelteComponent, ComponentConstructorOptions } from 'svelte'; declare global { class Component extends SvelteComponent {} var component: Component; var props: Record<string, any>; } export {} // @filename: index.ts // @errors: 2339 // ---cut--- console.log(component.count); component.count += 1; ```