#reactjs
#reactjs
Вопрос:
У меня есть <HashRouter>
перенос компонентов, который содержит <Link>
компоненты, однако я все равно получаю ошибку Error: Invariant failed: You should not use <Link> outside a <Router>
. Есть ли какая-то иерархия, в которой говорится, что у вас должны быть ссылки на более высоком уровне, чем у меня? У меня есть <Link>
выпадающий список внутри. Что-то вроде моего приложения:
<HashRouter>
<ComponentA>
<ComponentB>
<Link to="/my-path"/>
</ComponentB>
</ComponentA>
</HashRouter>
Редактировать:
Что я делаю, так это добавляю <Link>
внутри пользовательской опции внутри выпадающего списка, который я получил из библиотеки. В нем говорится, что я могу добавлять пользовательские элементы в свои выпадающие параметры. Выпадающий список, который я создаю, сложный, с кнопками внутри него, и я хочу перейти к одному месту, если щелкнуть заголовок. Вот где Link
это происходит. Когда я добавляю ссылку туда, появляется сообщение об ошибке, но не тогда, когда я добавляю ссылку непосредственно к компоненту, который использует выпадающий список. Вот как у меня есть компонент, который не работает. Это просто издевательские данные, данные, которые я использую, вычисляются внутри .map
:
const CustomLink = () => <Link to="/some-path">Title of link</Link>;
const data = [{
selected_key: 'id1',
content: [<CustomLink />, <CustomButton />]
},
...
]
return <DropdownFromLibrary data={data} />;
Я хочу / нужно добавить компоненты внутри массива, но приведенный выше пример не работает. Это ниже работает, чтобы иметь ссылку внутри того же компонента, что и выпадающий список, но это не то, что я хочу, так как мне нужно вычислить новый путь к каждой опции:
return (
<>
<CustomLink />
<DropdownFromLibrary data={data} />
</>
);
РЕШЕНИЕ
import { useHistory } from 'react-router-dom';
...
const history = useHistory();
const CustomLink = ({ id, title }) => <div onClick={() => history.push(`/some-title/${id}`)}>{title}</div>
const data = [{
selected_key: 'id1',
content: [<CustomLink />, <CustomButton />]
},
...
]
return <DropdownFromLibrary data={data} />;
Комментарии:
1. Нет никаких ограничений на то, где в маршрутизаторе
Link
должен появиться. Вероятно, вам не хватает чего-то, что вы не включили в свой вопрос. Если вы можете, пожалуйста, предоставьте минимальный рабочий пример, который воспроизводит проблему, например, в codesandbox.2. Также смотрите Этот codesandbox , который демонстрирует, что представленный вами код работает должным образом.
Ответ №1:
У вас ошибка, потому что ссылка должна идти внутри < ComponentB> . Я имею в виду внутри функции ComponentB. Оберните возвращаемые элементы ur внутри ссылки.
Комментарии:
1. @RMT, это решило проблему или вы хотите, чтобы я объяснил это подробнее. Пожалуйста, дайте мне знать, решил ли мой ответ вашу проблему.