Sapper/Svelte 可以有条件地导入组件吗?
Sapper/Svelte possible to conditionally import components?
在 Sapper 中,我尝试仅在呈现客户端时才导入组件(使用 onMount
)。有没有类似于 React Suspense
和 React.lazy
的东西?或者有其他方法吗?
你当然可以那样做,是的:
<script>
import { onMount } from 'svelte';
let Thing;
onMount(async () => {
Thing = (await import('./Thing.svelte')).default;
});
</script>
<svelte:component this={Thing} answer={42}>
<p>some slotted content</p>
</svelte:component>
或者,您可以将其包装到一个组件中:
<!-- Loader.svelte -->
<script>
import { onMount } from 'svelte';
let loader;
let Component;
onMount(async () => {
Component = (await loader()).default;
});
export { loader as this };
</script>
<svelte:component this={Component} {...$$restProps}>
<slot></slot>
</svelte:component>
{#if !Component}
<slot name="fallback"></slot>
{/if}
<Loader
this={() => import('./Thing.svelte')}
answer={42}
>
<p>some slotted content</p>
<p slot="fallback">loading...</p>
</Loader>
Demo here。这种方法的一个警告是 default
以外的插槽不会 'forwarded' 到基础组件。
在 Sapper 中,我尝试仅在呈现客户端时才导入组件(使用 onMount
)。有没有类似于 React Suspense
和 React.lazy
的东西?或者有其他方法吗?
你当然可以那样做,是的:
<script>
import { onMount } from 'svelte';
let Thing;
onMount(async () => {
Thing = (await import('./Thing.svelte')).default;
});
</script>
<svelte:component this={Thing} answer={42}>
<p>some slotted content</p>
</svelte:component>
或者,您可以将其包装到一个组件中:
<!-- Loader.svelte -->
<script>
import { onMount } from 'svelte';
let loader;
let Component;
onMount(async () => {
Component = (await loader()).default;
});
export { loader as this };
</script>
<svelte:component this={Component} {...$$restProps}>
<slot></slot>
</svelte:component>
{#if !Component}
<slot name="fallback"></slot>
{/if}
<Loader
this={() => import('./Thing.svelte')}
answer={42}
>
<p>some slotted content</p>
<p slot="fallback">loading...</p>
</Loader>
Demo here。这种方法的一个警告是 default
以外的插槽不会 'forwarded' 到基础组件。