Я пытаюсь динамически изменить изображение (дневное изображение или ночное изображение), когда человек нажимает кнопку света. Это работает, но мне нужно обновить страницу, чтобы отобразилось изображение. Дневное и ночное время — это, по сути, просто логические значения «истина» или «ложь» для моей переменной темы.
Я попробовал закодировать это следующим образом:
использовать 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 (где возникает проблема):
<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);
Любая подсказка о том, что может происходить? Изменения фона темы являются реактивными, но для баннера мне приходится обновить страницу, чтобы изображение появилось.
@JaromandaX У меня есть кнопка, которая переключает смену темы. И в файле javascript, я думаю, он тоже устанавливает это там. Как вы думаете, это может быть причиной?
Мне интересно, почему ты делаешь это двумя разными способами, вот и все.
Одной из причин может быть то, что 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 };
}
Бинго. Спасибо! Мне было интересно, застряло ли оно локально, а не глобально.
Без проблем! Не могли бы вы также проголосовать за мой ответ? Спасибо!
почему вы устанавливаете значение localStorage в двух местах двумя разными способами?