У меня есть этот наблюдатель в моем app.vue это гарантирует правильную тему attribute установлен на html ярлык. У меня есть вложенный цикл if / else, и, как вы можете видеть в приведенном ниже коде, у меня есть два разных условия, но два раза одни и те же операторы.
Есть ли способ закодировать этот способ более многократного использования? Я могу представить, что в некоторых случаях будет больше условий с, возможно, теми же утверждениями.
created() {
const media = window.matchMedia("(prefers-color-scheme: dark)");
this.$store.watch(
(state) => {
return state.settings.colorSettings.automatic;
},
(currentAutomaticValue) => {
if (currentAutomaticValue) {
media.addEventListener("change", this.setTheme);
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches
? setThemeAttribute(themes.dark) // 1
: setThemeAttribute(themes.default); // 2
} else {
media.removeEventListener("change", this.setTheme);
this.colorSettings.darkMode
? setThemeAttribute(themes.dark) // 1
: setThemeAttribute(themes.default); // 2
}
},
{ immediate: true }
);
},
1 ответ
Итак, у вас есть логическое значение, и из этого логического значения вы выбираете либо themes.dark или themes.default. Легко, извлеките метод, который принимает логическое значение и правильно вызывает setThemeAttribute.
function setThemeBoolean(bool) {
setThemeAttribute(bool ? themes.dark : themes.default);
}
...
if (currentAutomaticValue) {
media.addEventListener("change", this.setTheme);
setThemeBoolean(window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches);
} else {
media.removeEventListener("change", this.setTheme);
setThemeBoolean(this.colorSettings.darkMode);
}

Это лучший ответ, который я мог придумать, но я бы порекомендовал опубликовать больше контекста в следующий раз. Просто у меня такое ощущение, что ты делаешь что-то не самым оптимальным образом. Я подозреваю все
this.$store.watchможет и не понадобиться.— Саймон Форсберг
Современный JS ??
matchMediaимеет полную поддержку caniuse.com/matchmedia поэтому нет необходимости предиктировать его существование, вы должны использовать дополнительный оператор цепочки, если вам нужно вызвать неизвестное. НАПРИМЕРmatchMedia?.("foo").matches, иwindowпо умолчаниюglobalThisпоэтому его использование почти всегда избыточно. Таким образом линия разделения становитсяsetThemeBoolean(matchMedia("foo").matches)— Слепой67
@ Blindman67 Я только что ответил на главный вопрос, рекомендую вам опубликовать свои выводы в другом ответе.
— Саймон Форсберг