Переключение компонентов в Svelte/SvelteKit не работает

Вчера я начал изучать Svelte как свою первую платформу Javascript для внешнего интерфейса, и я был разочарован, пытаясь решить одну проблему за другой. Сегодня у меня возникла еще одна проблема, которую я не смог решить.

Я пытаюсь реализовать функцию, позволяющую переключать компоненты. Если пользователь нажимает на значок «Настройки», я хочу отобразить компонент «Настройки», а в компоненте «Настройки», если он нажимает на значок «Назад», компонент «Настройки» закрывается.

Звучит просто, но по какой-то причине я не могу заставить это работать!

Это мои сообщения/+page.svelte -

<script>
    import Settings from '../../components/Settings.svelte';

    let showSettings = false;

    function toggleSettings() {
        showSettings = !showSettings;
        console.info('Toggle Settings Clicked. showSettings:', showSettings);
    }
</script>

<style>
    /* My styles are here */
</style>

<body class = "text-white" style = "background-color: #000000;">
    <div class = "container-fluid min-vh-100 d-flex flex-column" style = "width: 80%;">
        <div class = "row flex-grow-1">
            <div class = "col-md-4 border-right" id = "sidebar-container">
                <div class = "p-3">
                    <div class = "d-flex align-items-center justify-content-between">
                        <h3 style = "font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, Helvetica, sans-serif; font-weight: 700; font-size: 20px; line-height: 24px; color: #e7e9ea;">Messages</h3>
                        <div class = "fs-6 text-white">
                            <button id = "gear-icon" class = "icon-button" on:click = {toggleSettings} aria-label = "Toggle Settings">
                                <i class = "bi bi-gear me-3"></i>
                            </button>
                            <i class = "bi bi-envelope-at"></i>
                        </div>
                    </div>
                    <br id = "break-tag">
                    <div id = "welcome-message">
                        <h4 style = "font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, Helvetica, sans-serif; font-weight: 800; font-size: 31px; line-height: 36px; color: #e7e9ea;">Welcome to your inbox!</h4>
                        <p style = "font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, Helvetica, sans-serif; font-weight: 400; font-size: 15px; line-height: 20px; color: #71767b;">Search for a user and have private conversations with them.</p>
                        <button class = "btn p-3" style = "font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, Helvetica, sans-serif; font-weight: 700; font-size: 17px; line-height: 20px; color: #ffffff; background-color: #1d9bf0; border-radius: 50px;">Write a message</button>
                    </div>
                </div>
            </div>
            {#if showSettings}
                <Settings />
            {:else}
                <div id = "content-column" class = "col-md-8 border-right d-flex flex-column align-items-center justify-content-center">
                    <div class = "p-3 text-center">
                        <h3 style = "font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, Helvetica, sans-serif; font-weight: 800; font-size: 31px; line-height: 36px; color: #e7e9ea;">Select a message</h3>
                        <p style = "font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, Helvetica, sans-serif; font-weight: 400; font-size: 15px; line-height: 20px; color: #71767b;">Choose from your existing conversations, or start a new one.</p>
                        <button class = "btn p-3" style = "font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, Helvetica, sans-serif; font-weight: 700; font-size: 17px; line-height: 20px; color: #ffffff; background-color: #1d9bf0; border-radius: 50px;">New message</button>
                    </div>
                </div>
            {/if}
        </div>
    </div>
</body>

Ничего не происходит, когда я нажимаю на значок настроек. Ничего даже не отправляется в консоль браузера. В моем терминале ошибок не отображается. Я не знаю, в чем может быть проблема. Как будто Svelte/Sveltekit даже не распознает мои нажатия кнопок. Я не знаю, неправильный ли мой код или моя конфигурация где-то неверна для обработчиков событий. Я установил все через npm, поэтому не думаю, что что-то упускаю.

У меня тоже есть проблема.

user25237035 01.07.2024 11:48

@JohnPhilips, пожалуйста, скажите мне, если вы решите эту проблему.

hypedstan 01.07.2024 12:09

Я бы сказал, что если щелчок JS и console.info() даже не срабатывают, где-то должна быть ошибка JS? Я скопировал это в REPO, и все работало нормально. Путь к компоненту «Настройки» случайно неверный? Возможно, когда вы нажимаете кнопку, showSettings === true вызывает проблему, поэтому console.info() никогда не срабатывает.

thegaffney 01.07.2024 17:51

@thegaffney Я решил это.

hypedstan 02.07.2024 11:30

@JohnPhilips Я решил это

hypedstan 02.07.2024 11:31

Логика в порядке. Хотя <body> уже должен быть определен где-то еще (app.html в SvelteKit), если вы попытаетесь вложить элементы тела, это может привести к проблемам. Кроме того, вы используете кнопку отправки (по умолчанию type из <button>), чтобы открыть настройки. Если в дело вмешается форма, это также вызовет проблемы.

brunnerh 02.07.2024 11:31

@brunnerh, вы правы, что причиной проблем была проблема с HTML. Кто-то сказал мне об этом вчера. Спасибо

hypedstan 02.07.2024 11:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я решил это с помощью кого-то. Проблема была где-то в другом месте моего проекта.

Учитывая, что я впервые использовал интерфейс JS-фреймворка, я испортил свой макет/+page.svelte, и это повлияло на мои сообщения/+Page.svelte, где находился приведенный выше код в моем вопросе.

Проблема заключалась в том, что мой html-макет имел

<head> </head>

html, который уже обрабатывался моим app.html, поэтому мне пришлось использовать синтаксис svelte вместо тега в моем файле макета -

<svelte:head> </svelte:head>

И это решило проблему.

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