#javascript #reactjs #if-statement #ternary-operator
#javascript #reactjs #if-оператор #тернарный оператор
Вопрос:
Итак, у меня есть компонент под названием PrivateRoute.js, который в основном защищает некоторые маршруты и перенаправляет пользователя на страницу входа, если они не вошли в систему, я хотел бы отобразить предупреждающее сообщение внутри троичного оператора, мое предупреждение проходит, но через несколько секунд я получаю сообщение об ошибке
PrivateRoute
function PrivateRoute({ component: Component, ...rest }) {
return (
<Route
{...rest}
render={props =>
/*If "IsLoggedIn" is located inside the local storage(user logged in), then render the component defined by PrivateRoute */
localStorage.getItem("IsLoggedIn") ? (
<Component {...props} />
) : alert('You must be logged in to do that!') ( //else if there's no authenticated user, redirect the user to the signin route
<Redirect
to='/signin'
/>
)
}
/>
);
}
это ошибка, которую я получаю в react:
Как мне отобразить предупреждение внутри троичного оператора без получения этой ошибки?
Комментарии:
1. У вас есть
alert("message")(<component />)
. Итак, он собирается вызвать то, чтоalert
возвращает,alert
а затем попытаться вызвать то, что возвращает. Но вызовalert
просто дает вамundefined
то, что не может быть вызвано. Ничего общего с React.2. Происходит, когда вы не используете точки с запятой…. Ваш код в основном
var foo = alert('x'); foo(<render>)
Ответ №1:
JavaScript видит, alert(...) (...)
как будто вы хотите вызвать возвращаемое значение alert
как функцию, но alert
не возвращает функцию. Вот о чем говорит ошибка.
Если вы хотите последовательно вычислить несколько выражений, вы можете использовать оператор запятой:
condition ? case1 : (alert('some message'), <Redirect ... />)
// ^ ^ ^
Вы можете добиться того же, переместив alert
вызов перед return
оператором, что также упрощает ваш код:
render() {
const isLoggedIn = localStorage.getItem("IsLoggedIn");
if (!isLoggedIn) {
alert(...);
}
return <Route ... />;
}
Обратите внимание, что localStorage
хранятся только строковые значения, поэтому вам, вероятно, потребуется преобразовать возвращаемое значение localStorage.getItem("IsLoggedIn")
в фактическое логическое значение.
Сказав все это, обратите внимание, что вам следует избегать использования alert
, поскольку это блокирует.
Комментарии:
1. Вы можете , но гораздо лучше перенести эту логику из JSX в тело функции для
render
.2. @T.J.Crowder: Правильно.