Привет, я изучаю Svelte и наткнулся на эту проблему. У меня есть кнопка подтверждения с использованием слотов, которые я пытаюсь поместить в свой модальный компонент. Но он не появляется. Также я пытаюсь переслать событие, когда вы нажимаете кнопку Close
в модальном компоненте. Но ничего не происходит. В идеале событие должно быть захвачено и выведено на консоль в браузере. Вот мои два компонента
app.svelte
<script>
import Modal from "./Modal.svelte";
import Product from "./Product.svelte";
let modalDisplay = false;
let products = [
{
id: "24",
title: "cat",
subtitle: "animal",
}
];
function eventAddCart(event) {
console.info(event.detail);
console.info("---------");
}
function eventDelete(event) {
console.info(event.detail);
}
function handleModalClose(event) {
console.info("=============== = ");
console.info(event.detail);
}
</script>
<h1>This is a product</h1>
<!-- createEventDispatcher -->
{#each products as product}
<Product
{...product}
on:add-to-cart = {eventAddCart}
on:my-delete = {eventDelete}
/>
{/each}
<button on:click = {() => (modalDisplay = true)}>Display modal</button>
{#if modalDisplay}
<Modal on:close-my-modal = {handleModalClose} >
<h1 slot = "header">My Markup</h1>
<!-- <p>This is what is wanted</p> -->
<!-- <p>Allow me </p> -->
<button slot = "footer">confirm</button>
</Modal>
{/if}
<style>
h1 {
color: purple;
}
</style>
Modal.svelte
<script>
import {createEventDispatcher} from 'svelte';
const dispatch = createEventDispatcher();
// export let modalDisplay = false;
function closeModal(){
dispatch("close-my-modal");
}
</script>
<div class = "backdrop" />
<div class = "modal">
<header>
<!-- add marked slot here -->
<slot name = "header" />
</header>
<div class = "content">
<!-- add unmarked slot here -->
<slot />
</div>
<footer>
<button onclick = {closeModal}>Close</button>
<slot class = "footer">
</slot>
</footer>
</div>
<style>
.backdrop {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100vh;
background: rgba(0, 0, 0, 0.75);
z-index: 10;
}
.modal {
padding: 1rem;
position: fixed;
top: 10vh;
left: 10%;
width: 80%;
max-height: 80vh;
background: white;
border-radius: 5px;
z-index: 100;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
overflow: scroll;
}
header {
border-bottom: 4px #c23535;
}
</style>
Вы ставите class
вместо name
здесь:
<slot class = "footer">
</slot>
Так что это просто еще один экземпляр слота default
.
Это не обработчик событий Svelte и поэтому не будет работать:
<button onclick = {closeModal}>
Должно быть on:click.
Спасибо, это решение сработало