JS — те же повторяющиеся операторы в if-else

У меня есть этот наблюдатель в моем 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 ответ
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 Я только что ответил на главный вопрос, рекомендую вам опубликовать свои выводы в другом ответе.

    — Саймон Форсберг

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *