Я хочу улучшить более одного «если и еще если». У меня есть условия, упомянутые ниже, но я раздражаюсь, потому что делаю слишком много «повторений». Как я могу это исправить?
const locale = window.location.origin;
const pathName = window.location.pathname;
let lang = pathName.toString().split("/")[1];
if (lang === "")
lang = "tr"
else if (lang === "en")
lang = "en"
else if (lang === "ar")
lang = "ar"
else if (lang !== "tr" || "en" || "ar")
lang = localStorage.getItem('VueAppLanguage')
console.log(lang)
const res = await axios.get(locale + '/' + lang + '/categories')
Кстати, lang !== "tr" || "en" || "ar"
всегда будет правдивым. Булевы операторы так не работают! Должно быть lang !== "tr" && lang !== "en" && lang != "ar"
или !["tr", "en", "ar"].includes(lang)
.
Вы можете взять значение по умолчанию и проверить известные языки.
lang ||= "tr";
if (!['ar', 'en', 'tr'].includes(lang)) lang = localStorage.getItem('VueAppLanguage');
Выражение
lang !== "tr" || "en" || "ar"
не работает должным образом, потому что сравнение
lang !== "tr"
проверяет только первую строку и никогда другую для сравнения.
Значение с проверкой логическое ИЛИ ||
— это левая часть (левая сторона) равна правдивый, как непустая строка или другие (см. ссылку), и принимает только следующее значение, если левая сторона равна ложный, противоположной правдивый.
Для сравнения списка (здесь массив) значений можно взять Array#includes
.
ошибка, которую я получил Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'inline') at ContentFiltering.apply (include.preload.js:2287:18)
извините, я не могу помочь.
Я понимаю ошибку, но я понятия не имею, как ее решить. Ошибка: когда вы вручную меняете значение VueAppLanguage
в «Локальном хранилище» и обновляете страницу, это вызывает «вышеупомянутую» ошибку.
у меня нет опыта работы с локальным хранилищем и промисами, извините.
pathName.toString().split("/")[1]
пусто, установите «tr» в качестве значения по умолчанию.const locale = window.location.origin;
const pathName = window.location.pathname;
let lang = pathName.toString().split("/")[1] || "tr"; // 1
let noStandardLanguage = !["tr","en","ar"].includes(lang); // 2
if (noStandardLanguage)
lang = localStorage.getItem('VueAppLanguage')
console.log(lang)
const res = await axios.get(locale + '/' + lang + '/categories')
ошибка, которую я получил Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'inline') at ContentFiltering.apply (include.preload.js:2287:18)
Основываясь на коде, который вы разместили, я думаю, что это await axios.get(locale + '/' + lang + '/categories')
выдает эту ошибку. Вам нужно добавить точки останова, чтобы понять, почему lang
или locale
не определены. Например, что возвращает localStorage.getItem('VueAppLanguage')
?
все мои условия работают, как я сказал выше. но когда я использую ваши коды, которые я не понимаю, я получаю ошибку, которую я сказал. Я пытаюсь найти, откуда исходит ошибка.
Я понимаю ошибку, но я понятия не имею, как ее решить. Ошибка: когда вы вручную меняете значение VueAppLanguage
в «Локальном хранилище» и обновляете страницу, это вызывает «вышеупомянутую» ошибку.
Что ж, странно, если ваш исходный код не генерирует ту же ошибку, потому что она должна быть такой же (неправда: ваш код всегда читается из VueAppLanguage). Я также понятия не имею, на что вы изменили VueAppLanguage и почему у вас вообще такой код. Если вы хотите разрешить только "tr", "en", "ar" в качестве языков, тогда код не должен выглядеть так, но это не то, о чем вы просили. Кроме того, я понятия не имею, какие параметры разрешены в вызове API, потому что исходный код никогда не объяснял этого.
просто ради лучшей абстракции я бы использовал карту, связывающую значения пути локали с языком на случай, если они не всегда полностью совпадают, и я бы просто взял язык, сопоставленный с текущей локалью, если таковой имеется, иначе
localStorage.getime('VueAppLanguage')
. Я писал такой ответ, но вижу, что у вас уже есть рабочие решения в очереди ответов.