#reactjs #react-router-dom
#reactjs #react-router-dom
Вопрос:
Я создал <Authorise />
компонент, который отображает либо «да», либо «нет» на основе логического значения «разрешено».
export const Authorise = ({
allow = false,
yes = () => null,
no = () => null
}) => (allow ? yes() : no());
<Authorise />
компонент работает должным образом, однако, когда я пытаюсь отобразить a <Route />
, отображается только первый маршрут, а остальные <Route />
компоненты игнорируются.
Почему это происходит? Если я отображаю маршруты за пределами <Authorise />
компонента, он работает нормально. Только при рендеринге компонентов через <Authorise />
компонент это не работает, и я не могу понять, почему.
Посмотрите мой пример, чтобы увидеть проблему: CodeSandbox
Ответ №1:
Это из-за
https://reactrouter.com/web/api/Switch/children-node
Все дочерние элементы a
<Switch>
должны быть<Route>
<Redirect>
элементами or. Будет отображен только первый дочерний элемент, соответствующий текущему местоположению.
Если вы используете библиотеку, но не играете по ее правилам, то ожидалось, что произойдет нечто подобное.
Ответ №2:
Проблема не в вашей функции авторизации, а в компоненте маршрута, который будет отображаться только при совпадении пути. Второй выдает его с помощью переключателя, который сделает так, чтобы отображался только первый согласованный маршрут
При добавлении переключателя путь «/» всегда будет выбран, так как он является первым. Если вы попытаетесь удалить свой переключатель (или переместить маршрут с «/» в конце) и перейти к «/ next» на вашем локальном разработчике, тогда будет отображен маршрут / next
Комментарии:
1. Если вы посмотрите на мой Codesandbox, то ясно увидите, что это не так. Маршрут не отображается, даже если маршрут сопоставлен. Если вы извлекаете маршрут из компонента авторизации и помещаете его внутрь коммутатора, он работает.