Svelte пропонує різноманітні механізми для налагодження взаємодії між компонентами, включаючи передачу пропсів, використання слотів та інші підходи. Зокрема, для створення гнучких та багаторазових компонентів у ваших проєктах на Svelte, вам знадобиться вміння застосовувати слоти.
Основи роботи зі слотами у Svelte
Слоти у фреймворку Svelte мають схожий принцип дії, як і слоти у Vue. Вони забезпечують можливість передачі контенту від батьківського компонента до дочірнього. Завдяки слотам ви можете визначити в шаблоні компонента місця-заповнювачі, куди згодом можна буде вставити контент, що передається з батьківського компонента.
Цим контентом може бути простий текст, HTML-розмітка або інші Svelte-компоненти. Використання слотів відкриває шлях до створення висококастомізованих та динамічних компонентів, здатних адаптуватися до різних потреб.
Створення простого слота
Щоб створити слот у Svelte, використовуйте елемент `slot` у шаблоні компонента. Цей елемент слугує як місце-заповнювач для контенту, який ви передаєте з батьківського компонента. За замовчуванням, слот відображає будь-який переданий йому контент.
Розглянемо приклад створення базового слота:
<main> Це дочірній компонент <slot></slot> </main>
Наведений вище код ілюструє дочірній компонент, який використовує елемент `slot` для отримання контенту від батьківського компонента.
Щоб передати контент з батьківського компонента до дочірнього, спочатку імпортуйте дочірній компонент у батьківський. Потім, замість використання самозакриваючого тегу для відображення дочірнього компонента, застосуйте відкриваючий та закриваючий теги. В межах цих тегів розмістіть контент, який ви хочете передати від батьківського до дочірнього компонента.
Наприклад:
<script> import Component from "./Component.svelte"; </script> <main> Це батьківський компонент <Component> <span>Це повідомлення від батьківського компонента</span> </Component> </main>
Окрім передачі контенту від батьківських до дочірніх компонентів, ви також можете визначити резервний контент або контент за замовчуванням у слотах. Цей контент буде показано, якщо батьківський компонент не передасть жодного контенту.
Ось приклад того, як можна визначити резервний контент:
<main> Це дочірній компонент <slot>Резервний контент</slot> </main>
У цьому прикладі текст “Резервний контент” використовується як запасний варіант для відображення, якщо батьківський компонент не надає жодного контенту.
Передача даних через слоти за допомогою пропсів слотів
Svelte дозволяє передавати дані в слоти за допомогою пропсів слотів. Використовуйте їх, коли вам потрібно передати певні дані від дочірнього компонента до контенту, який ви вставляєте.
Наприклад:
<script> let message="Привіт, батьківський компонент!" </script> <main> Це дочірній компонент <slot message={message}></slot> </main>
У цьому коді, в тезі `script`, оголошується змінна `message` та присвоюється їй значення “Привіт, батьківський компонент!”. Ця змінна потім передається як проп `message` слоту, роблячи дані доступними для батьківського компонента при вставці контенту.
<script> import Component from "./Component.svelte"; </script> <main> Це батьківський компонент <Component let:message> <div> Дочірній компонент каже: {message} </div> </Component> </main>
Синтаксис `let:message` дозволяє батьківському компоненту отримати доступ до пропса `message`, переданого з дочірнього компонента. Змінна `message` у тезі `div` представляє собою дані, які передаються з пропса слота.
Зауважте, що ви не обмежені одним пропсом, за потреби ви можете передавати декілька:
<script> let user = { firstName: 'Іван', lastName: 'Петренко' }; </script> <main> Це дочірній компонент <slot firstName={user.firstName} lastName={user.lastName}></slot> </main>
У батьківському компоненті:
<script> import Component from "./Component.svelte"; </script> <main> Це батьківський компонент <Component let:firstName let:lastName> <div> Ім'я користувача: {firstName} {lastName} </div> </Component> </main>
Практика з іменованими слотами
Використовуйте іменовані слоти, якщо потрібно передати кілька слотів у компонентах. Вони полегшують керування різними слотами, оскільки кожному можна надати унікальне ім’я. Завдяки іменованим слотам, ви можете створювати складні компоненти з різними макетами.
Для створення іменованого слота, передайте властивість `name` до елементу `slot`:
<div> Це дочірній компонент <p>Заголовок: <slot name="header"></slot></p> <p>Підвал: <slot name="footer"></slot></p> </div>
В цьому прикладі є два іменовані слоти: `header` (заголовок) та `footer` (підвал). Використовуючи властивість `slot`, можна передавати контент до кожного з них з батьківського компонента.
Наприклад:
<script> import Component from "./Component.svelte"; </script> <main> Це батьківський компонент <Component> <span slot="header">Це буде передано до слота заголовка</span> <span slot="footer">Це буде передано до слота підвалу</span> </Component> </main>
Цей код показує, як використовувати властивість `slot` для передачі контенту до іменованих слотів. У першому тегу `span`, передається властивість `slot` зі значенням “header”. Це гарантує, що текст всередині цього `span` буде відображено у слоті з іменем `header`. Аналогічно, текст у тезі `span` з атрибутом `slot` зі значенням “footer” буде відображено у слоті з назвою “footer”.
Особливості переадресації слотів
Переадресація слотів – це функція Svelte, яка дозволяє передавати контент від батьківського компонента через проміжний компонент-обгортку до дочірнього. Це може бути дуже корисно, коли потрібно передати контент з непов’язаних компонентів.
Розглянемо приклад використання переадресації слотів. Спочатку створимо дочірній компонент:
<main> Це дочірній компонент <slot name="message"></slot> </main>
Далі, створимо компонент-обгортку:
<script> import Component from "./Component.svelte"; </script> <main> <Component> <div slot="message"> <slot name="wrapperMessage"></slot> </div> </Component> </main>
У цьому блоці коду, інший іменований слот передається в слот `message` дочірнього компонента.
Тепер, у батьківському компоненті, напишіть такий код:
<script> import Wrapper from "./Wrapper.svelte"; </script> <main> Це батьківський компонент <Wrapper> <div slot="wrapperMessage"> Це повідомлення з батьківського компонента </div> </Wrapper> </main>
У наведеній структурі, контент “Це повідомлення з батьківського компонента” передається через компонент-обгортку безпосередньо в дочірній компонент завдяки слоту `wrapperMessage` у компоненті-обгортці.
Спростіть роботу зі слотами у Svelte
Слоти – це потужна функція Svelte, яка дозволяє створювати компоненти, які можна легко використовувати повторно. Ви вже навчилися створювати основні та іменовані слоти, використовувати пропси слотів та інші можливості. Розуміючи різні типи слотів і способи їх застосування, ви зможете створювати динамічні та гнучкі користувацькі інтерфейси.