Как нам использовать «именованные слоты» в Svelte 5?

Слоты Svelte 5 сбивают с толку

Теперь, когда Svelte 5 находится в предварительной версии, я чувствую, что могу выразить некоторую путаницу по поводу слотов в Svelte 5. В Svelte 4 слоты и названия слотов сделаны следующим образом:

ContactCard.svelte

<article class = "contact-card">
    <h2>
        <slot name = "name">
            <span class = "missing">Unknown name</span>
        </slot>
    </h2>

    <div class = "address">
        <slot name = "address">
            <span class = "missing">Unknown address</span>
        </slot>
    </div>

    <div class = "email">
        <slot name = "email">
            <span class = "missing">Unknown email</span>
        </slot>
    </div>
</article>

<style>...</style>

+page.svelte

<script>
    import ContactCard from './ContactCard.svelte';
</script>

<ContactCard>
    <span slot = "name"> P. Sherman </span>

    <span slot = "address">
        42 Wallaby Way<br />
        Sydney
    </span>
</ContactCard>

По моему скромному мнению, довольно просто и понятно.

Пример Svelte 5 с одним слотом

Component.svelte

<script>
  let { children } = $props();
</script>

<div>
  {@render children()}
</div>

+page.svelte

<script>
  import { Component } from '$lib';
</script>

<Component>
  ...content...
</Component>

Также легко...

Мой вопрос...

Как нам реализовать «именованные слоты» в этой новой парадигме?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
280
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы просто определяете #snippet внутри компонента.
Фрагмент будет передан как реквизит с тем же именем. Например.:

<script>
    import ContactCard from './ContactCard.svelte';
</script>

<ContactCard>
    {#snippet name()} P. Sherman {/snippet}

    {#snippet address()}
        42 Wallaby Way <br>
        Sydney
    {/snippet}
</ContactCard>

(Если вам нужны элементы span, вы можете добавить их внутрь фрагмента.)

<!-- ContactCard.svelte -->
<script>
  let { name, address } = $props();
</script>

<div>
  <div class = "name">{@render name()}</div>
  <div class = "address">{@render address()}</div>
</div>

Для резервного контента вы можете проверить, был ли передан фрагмент, например. используя {#if}, или определите резервный фрагмент.

<div class = "name">
    {@render name?.()}
    {#if !name}
        ...
    {/if}
</div>
<div class = "name">
    {#snippet nameUnknown()}...{/snippet}
    {@render (name ?? nameUnknown)()}
</div>

Фрагменты могут быть определены вне компонента, а также переданы явно:

{#snippet name()} P. Sherman {/snippet}
{#snippet address()}
    42 Wallaby Way <br>
    Sydney
{/snippet}
<ContactCard {name} {address} />

Определение области действия работает аналогично переменным; фрагменты доступны на том же уровне и глубже в своем элементе/блоке.


Примечание: прямое содержимое компонента просто неявно определяет фрагмент под названием children. Если вам нужно параметризовать фрагмент, вам также придется определить его более явно, например:

<FancyList items = {users}>
    {#snippet children(item)}
        {item.lastName}, {item.firstName}
    {/snippet}
</FancyList>

На этом этапе вы также можете назвать это как-нибудь более конкретно, например itemTemplate в этом примере.

Поэтому их нельзя использовать в файлах макетов.

Tithos 25.06.2024 22:34

Если вы имеете в виду макеты SvelteKit, то в них и так никогда не было ничего, кроме слота по умолчанию.

brunnerh 26.06.2024 01:35

Другие вопросы по теме