Задать вопрос
IDONTSUDO
@IDONTSUDO
ЧСВ программистов идет в комплекте с первой IDE.

JSX сложное сравнение?

Я хочу рендерить некоторые вещи, на странице в зависимости от пользовательской роли. Роль юзера лежит в локальной сторе, и выдается сервером. Для того что бы понять, какая у юзера роль. Я беру, из локальной стори данные функцией isAuthenticated, и на основании тернарного выражения в jsx пытаюсь рендерить. Но он при таком сложном сравнении либо не рендерит вообще ничего. Либо, рендерит все как есть. Ниже 2 примера, выражения через && и через | |.

Когда я использую && он вообще все в false превращает и ни черта не рендерит.

Когда я использую | | он все в true превращает.

Я не понимаю в чем проблема?

export const isAuthenticated = () => {
    if (typeof window == "undefined") {
        return false
    }
    if (localStorage.getItem("jwt")) {
        return JSON.parse(localStorage.getItem("jwt"))
    } else {
        return false
    }
}

5dc3d0e9e8fe6508713510.png

Есть такой код, функция isAuthenticated точно возвращает то что нужно.

При том, у меня есть похожий код. И он работает, но там тернарное выражение с одним сравнением.
{isAuthenticated().direct.role === "Директор" ? (
                    <Button
                      type="danger"
                      onClick={userId => this.handleClick(user._id, userId)}
                    >
                      Удалить Пользователя
                    </Button>
                    ):("")}
  • Вопрос задан
  • 199 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Krasnodar_etc
@Krasnodar_etc
fundraiseup
const userRole = isAuthenticated().direct.role;

['Директор', 'Управляющий' , 'role name'].includes(userRole) ? ...code... : ...code... ;


Правда, проблемы у вас всё равно есть. Самая очевидная - этот код падает, если юзер не авторизован и isAuthenticated возвращает false, а вы пытаетесь у этого значения свойство direct получить.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@curious-101
Frontend developer
isAuthenticated().direct.role === 'Директор' || isAuthenticated().direct.role === 'Управляющий' ... дальше, думаю догадаетесь сами
Ответ написан
@Dasslier
FrontEnd Developer
Вы должны каждый раз проверять результат выполнения функции, или вынесите этот результат в переменную. То есть вы ожидаете, что будет выполняться так:
{isAuthenticated().direct.role === "Директор" || isAuthenticated().direct.role === "Управляющий" || isAuthenticated().direct.role === "Бухгалтер" ? (
                    <Button
                      type="danger"
                      onClick={userId => this.handleClick(user._id, userId)}
                    >
                      Удалить Пользователя
                    </Button>
                    ):("")}


Но по факту делаете только первое сравнение, а дальше идет просто проверка на строку, и т.к. она не пустая, то всегда получаете true

И JSX тут не при делах, это вопрос к пониманию JavaScript

И еще, рендерите не пустую строку в случае false, а null
Ответ написан
Комментировать
@davidnum95
Код картинками это конечно сильно, ни скопировать чтобы исправить, ни указать где ошибка.
Ответ написан
@vadimMalovaniy
ты понимаешь что сравниваешь только одну роль? isAuthenticated().direct.role === "Директор"
"Бухгалтер" ? (<Sub>)... всегда будет true.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы