svelte 包公开了 生命周期函数上下文 API

onMount

  1. function onMount<T>(
  2. fn: () =>
  3. | NotFunction<T>
  4. | Promise<NotFunction<T>>
  5. | (() => any)
  6. ): void;

onMount 函数安排一个回调在组件首次挂载到 DOM 后立即运行。它必须在组件的初始化期间被调用(但不需要活在 组件内部;它可以从外部模块被调用)。

onMount 不在 服务器端组件 中运行。

  1. <script>
  2. import { onMount } from 'svelte';
  3. onMount(() => {
  4. console.log('the component has mounted');
  5. });
  6. </script>

如果从 onMount 返回一个函数,它将在组件卸载时被调用。

  1. <script>
  2. import { onMount } from 'svelte';
  3. onMount(() => {
  4. const interval = setInterval(() => {
  5. console.log('beep');
  6. }, 1000);
  7. return () => clearInterval(interval);
  8. });
  9. </script>

这种行为只有在传递给 onMount 的函数 同步 返回一个值时才有效。async 函数总是返回一个 Promise,因此不能 同步 返回一个函数。

beforeUpdate

  1. function beforeUpdate(fn: () => any): void;

安排一个回调在组件在任何状态改变后更新之前立即运行。

回调第一次运行将在初始 onMount 之前

  1. <script>
  2. import { beforeUpdate } from 'svelte';
  3. beforeUpdate(() => {
  4. console.log('the component is about to update');
  5. });
  6. </script>

afterUpdate

  1. function afterUpdate(fn: () => any): void;

安排一个回调在组件更新后立即运行。

回调第一次运行将在初始 onMount 之后

  1. <script>
  2. import { afterUpdate } from 'svelte';
  3. afterUpdate(() => {
  4. console.log('the component just updated');
  5. });
  6. </script>

onDestroy

  1. function onDestroy(fn: () => any): void;

安排一个回调在组件卸载之前立即运行。

onMountbeforeUpdateafterUpdateonDestroy 中,这是唯一一个在服务器端组件中运行的。

  1. <script>
  2. import { onDestroy } from 'svelte';
  3. onDestroy(() => {
  4. console.log('the component is being destroyed');
  5. });
  6. </script>

tick

  1. function tick(): Promise<void>;

返回一个承诺,一旦任何待处理状态改变被应用,或者如果没有,在下一个微任务中解决。

  1. <script>
  2. import { beforeUpdate, tick } from 'svelte';
  3. beforeUpdate(async () => {
  4. console.log('the component is about to update');
  5. await tick();
  6. console.log('the component just updated');
  7. });
  8. </script>

setContext

  1. function setContext<T>(key: any, context: T): T;

将一个任意的 context 对象与当前组件和指定的 key 关联,并返回该对象。上下文随后对组件的子级(包括插槽内容)可用,使用 getContext

像生命周期函数一样,这必须在组件初始化期间被调用。

  1. <script>
  2. import { setContext } from 'svelte';
  3. setContext('answer', 42);
  4. </script>

上下文本质上不是响应式的。如果您需要上下文中的反应性值,那么您可以将存储传递给上下文,这将是响应式的。

getContext

  1. function getContext<T>(key: any): T;

检索属于具有指定 key 的最近父组件的上下文。必须在组件初始化期间调用。

  1. <script>
  2. import { getContext } from 'svelte';
  3. const answer = getContext('answer');
  4. </script>

hasContext

  1. function hasContext(key: any): boolean;

检查给定的 key 是否已在父组件的上下文中设置。必须在组件初始化期间调用。

  1. <script>
  2. import { hasContext } from 'svelte';
  3. if (hasContext('answer')) {
  4. // 做点什么
  5. }
  6. </script>

getAllContexts

  1. function getAllContexts<
  2. T extends Map<any, any> = Map<any, any>
  3. >(): T;

检索属于最近父组件的整个上下文映射。必须在组件初始化期间调用。例如,如果您以编程方式创建组件并希望将现有上下文传递给它时非常有用。

  1. <script>
  2. import { getAllContexts } from 'svelte';
  3. const contexts = getAllContexts();
  4. </script>

createEventDispatcher

  1. function createEventDispatcher<
  2. EventMap extends Record<string, any> = any
  3. >(): EventDispatcher<EventMap>;

创建一个事件分派器,可用于分派 组件事件。事件分派器是可以带有两个参数的函数:namedetail

使用 createEventDispatcher 创建的组件事件会创建一个 CustomEvent。这些事件不会 冒泡detail 参数对应于 CustomEvent.detail 属性,可以包含任何类型的数据。

  1. <script>
  2. import { createEventDispatcher } from 'svelte';
  3. const dispatch = createEventDispatcher();
  4. </script>
  5. <button on:click={() => dispatch('notify', 'detail value')}>触发事件</button>

从子组件分派的事件可以在其父组件中被监听。在分派事件时提供的任何数据都可以在事件对象的 detail 属性上获得。

  1. <script>
  2. function callbackFunction(event) {
  3. console.log(`Notify fired! Detail: ${event.detail}`);
  4. }
  5. </script>
  6. <Child on:notify={callbackFunction} />

通过向分派函数传递第三个参数,可以使事件可取消。如果事件被 event.preventDefault() 取消,则函数返回 false,否则返回 true

  1. <script>
  2. import { createEventDispatcher } from 'svelte';
  3. const dispatch = createEventDispatcher();
  4. function notify() {
  5. const shouldContinue = dispatch('notify', 'detail value', { cancelable: true });
  6. if (shouldContinue) {
  7. // 没有人调用 preventDefault
  8. } else {
  9. // 一个监听器调用了 preventDefault
  10. }
  11. }
  12. </script>

您可以对事件分派器进行类型定义,以定义它可以接收哪些事件。这将使您的代码在组件内部(错误调用被标记)和使用组件时(事件的类型现在被缩小)更加类型安全。请参阅 这里 如何操作。

类型

ComponentConstructorOptions

  1. interface ComponentConstructorOptions<
  2. Props extends Record<string, any> = Record<string, any>
  3. > {…}
  1. target: Element | Document | ShadowRoot;
  1. anchor?: Element;
  1. props?: Props;
  1. context?: Map<any, any>;
  1. hydrate?: boolean;
  1. intro?: boolean;
  1. $$inline?: boolean;

ComponentEvents

方便的类型,用于获取给定组件期望的事件。示例:

  1. <script lang="ts">
  2. import type { ComponentEvents } from 'svelte';
  3. import Component from './Component.svelte';
  4. function handleCloseEvent(event: ComponentEvents<Component>['close']) {
  5. console.log(event.detail);
  6. }
  7. </script>
  8. <Component on:close={handleCloseEvent} />
  1. type ComponentEvents<Component extends SvelteComponent_1> =
  2. Component extends SvelteComponent<any, infer Events>
  3. ? Events
  4. : never;

ComponentProps

方便的类型,用于获取给定组件期望的属性。示例:

  1. <script lang="ts">
  2. import type { ComponentProps } from 'svelte';
  3. import Component from './Component.svelte';
  4. const props: ComponentProps<Component> = { foo: 'bar' }; // 如果这些不是正确的属性会出错
  5. </script>
  1. type ComponentProps<Component extends SvelteComponent_1> =
  2. Component extends SvelteComponent<infer Props>
  3. ? Props
  4. : never;

ComponentType

方便的类型,用于获取 Svelte 组件的类型。例如,与 <svelte:component> 一起使用动态组件时非常有用。

示例:

  1. <script lang="ts">
  2. import type { ComponentType, SvelteComponent } from 'svelte';
  3. import Component1 from './Component1.svelte';
  4. import Component2 from './Component2.svelte';
  5. const component: ComponentType = someLogic() ? Component1 : Component2;
  6. const componentOfCertainSubType: ComponentType<SvelteComponent<{ needsThisProp: string }>> = someLogic() ? Component1 : Component2;
  7. </script>
  8. <svelte:component this={component} />
  9. <svelte:component this={componentOfCertainSubType} needsThisProp="hello" />
  1. type ComponentType<
  2. Component extends SvelteComponent = SvelteComponent
  3. > = (new (
  4. options: ComponentConstructorOptions<
  5. Component extends SvelteComponent<infer Props>
  6. ? Props
  7. : Record<string, any>
  8. >
  9. ) => Component) & {
  10. /** The custom element version of the component. Only present if compiled with the `customElement` compiler option */
  11. element?: typeof HTMLElement;
  12. };

SvelteComponent

Svelte 组件的基类,具有一些小的开发增强功能。当 dev=true 时使用。

可用于创建强类型 Svelte 组件。

示例:

您在 npm 上有一个名为 component-library 的组件库,您从中导出一个名为 MyComponent 的组件。对于 Svelte+TypeScript 用户,您想提供类型定义。因此,您创建了一个 index.d.ts

  1. import { SvelteComponent } from "svelte";
  2. export class MyComponent extends SvelteComponent<{foo: string}> {}

这样打字使得像 VS Code 这样的 IDE(带有 Svelte 扩展)能够提供智能感知,并以这种方式在带有 TypeScript 的 Svelte 文件中使用组件:

  1. <script lang="ts">
  2. import { MyComponent } from "component-library";
  3. </script>
  4. <MyComponent foo={'bar'} />
  1. class SvelteComponent<
  2. Props extends Record<string, any> = any,
  3. Events extends Record<string, any> = any,
  4. Slots extends Record<string, any> = any
  5. > extends SvelteComponent_1<Props, Events> {…}
  1. [prop: string]: any;
  1. constructor(options: ComponentConstructorOptions<Props>);
  1. $capture_state(): void;
  1. $inject_state(): void;

SvelteComponentTyped

使用 SvelteComponent 代替。有关更多信息,请参见 PR:https://github.com/sveltejs/svelte/pull/8512

  1. class SvelteComponentTyped<
  2. Props extends Record<string, any> = any,
  3. Events extends Record<string, any> = any,
  4. Slots extends Record<string, any> = any
  5. > extends SvelteComponent<Props, Events, Slots> {}