Изображение не меняется динамически с помощью кнопки включения/выключения света на веб-сайте

Я пытаюсь динамически изменить изображение (дневное изображение или ночное изображение), когда человек нажимает кнопку света. Это работает, но мне нужно обновить страницу, чтобы отобразилось изображение. Дневное и ночное время — это, по сути, просто логические значения «истина» или «ложь» для моей переменной темы.

Я попробовал закодировать это следующим образом:

использовать Theme.js:

import { ref, watchEffect } from 'vue';

export default function useTheme() {
    const theme = ref(JSON.parse(localStorage.getItem('theme') || 'false'));

    watchEffect(() => {
        localStorage.setItem('theme', String(theme.value));
    });

    return { theme };
}

App.vue:

const { theme } = useTheme(); // Access the shared state.

const toggleTheme = () => {
  theme.value = !theme.value;
  document.body.classList.toggle('dark-theme', theme.value);
  localStorage.setItem('theme', JSON.stringify(theme.value));
}

Home.vue (где возникает проблема):

  • Часть HTML:
<img :src = "banner" alt = "Daytime Banner">
  • Расчет дневного и ночного времени:
import DayTimeBanner from "@/assets/banner-city-daytime.png";
import NightTimeBanner from "@/assets/banner-city-nighttime.png";
...
const { theme } = useTheme(); // Access the same shared state.

const banner = computed(() => theme.value ? NightTimeBanner : DayTimeBanner);

Любая подсказка о том, что может происходить? Изменения фона темы являются реактивными, но для баннера мне приходится обновить страницу, чтобы изображение появилось.

почему вы устанавливаете значение localStorage в двух местах двумя разными способами?

Jaromanda X 09.07.2024 11:22

@JaromandaX У меня есть кнопка, которая переключает смену темы. И в файле javascript, я думаю, он тоже устанавливает это там. Как вы думаете, это может быть причиной?

Josh 09.07.2024 12:08

Мне интересно, почему ты делаешь это двумя разными способами, вот и все.

Jaromanda X 09.07.2024 12:27
Поведение ключевого слова "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) для оценки ваших знаний,...
2
3
73
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Одной из причин может быть то, что useTheme не возвращает реактивное значение. Попробуйте использовать ref или реактивный

Было бы проще всего, если бы вы могли применить CSS вместо ресурса к src.

Предварительно определите два класса для обоих баннеров, например:,

 background: lightblue url("/assets/banner-city-daytime.png") no-repeat fixed center;

Я предполагаю, что вы разбираетесь в CSS :)

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

Ошибка заключается в том, что в вашем файле useTheme.js вы объявляете состояние «темы» внутри функции, поэтому вы создаете локальное состояние каждый раз, когда вызываете функцию useTheme() вместо глобального.

Измените свой код на это:

import { ref, watchEffect } from 'vue';

const theme = ref(JSON.parse(localStorage.getItem('theme') || 'false'));

watchEffect(() => {
    localStorage.setItem('theme', String(theme.value));
});

export default function() {
   return { theme };
}

Бинго. Спасибо! Мне было интересно, застряло ли оно локально, а не глобально.

Josh 09.07.2024 23:28

Без проблем! Не могли бы вы также проголосовать за мой ответ? Спасибо!

Ulisses Bardini 10.07.2024 18:27

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