Я не могу использовать NavLink вне компонента <Router>

Я создаю приложение React с помощью react-router-dom. Чтобы добавить больше анимации на свои страницы, я использую framer-motion для создания переходов между страницами приложения, но я не хочу, чтобы панель навигации анимировалась и обновлялась каждый раз, когда я перемещаюсь между своими маршрутами. Поэтому я убедился, что панель навигации не анимируется, не включив ее в свой маршрутизатор.

Проблема в том, что он отображает пустую страницу, и когда я захожу в консоль, появляется много ошибок, например:

Неперехваченная ошибка: useLocation() можно использовать только в контексте компонент.

Вышеупомянутая ошибка произошла в компоненте:

Вот мой код:

App.tsx

import React from "react";
import { createBrowserRouter, RouterProvider, Route } from "react-router-dom";
import Navbar from "./components/Navbar";
import { AnimatePresence } from "framer-motion";

import Home from "./pages/Home/Home.tsx";
import About from "./pages/About/About.tsx";

const router = createBrowserRouter([
  {
    path: "/",
    element: <Home />,
  },
  {
    path: "/about",
    element: <About /> 
  }
]);

function App() {
  return(
    <>
      <Navbar />
      
      <AnimatePresence mode = "wait">
        <RouterProvider router = {router} />
      </AnimatePresence>
    </>
  )
}

export default App;

Navbar.tsx

import React from "react";
import styled from "@emotion/styled";
import { NavLink } from "react-router-dom";

export default function Navbar(props: React.AllHTMLAttributes<HTMLElement>) {
  return (
    <NavbarDiv>
      <NavLink to = "/" className = {({ isActive }) => isActive ? "active" : ""}>
        Home
      </NavLink>
      <NavLink to = "/" className = {({ isActive }) => isActive ? "active" : ""}>
        About
      </NavLink>
    </NavbarDiv>
  )
}

const NavbarDiv = styled.div`
  width: 100%;
  height: 85px;
  background-color: #242424;
  color: var(--background-color);
  box-shadow: 0 2px 4px 0 rgba(0,0,0,.25);
`;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ссылки в Navbar должны отображаться в контексте маршрутизации. Немного рефакторинг кода, чтобы создать маршрут макета , который отображает Navbar, и компонент Outlet для вложенных маршрутов, отображаемых маршрутом макета.

Пример:

import React from "react";
import {
  createBrowserRouter,
  RouterProvider,
  Route,
  Outlet,
} from "react-router-dom";
import { AnimatePresence } from "framer-motion";
import Home from "./pages/Home/Home.tsx";
import About from "./pages/About/About.tsx";
import Navbar from "./components/Navbar";

const AppLayout = () => (
  <>
    <Navbar />
    <AnimatePresence mode = "wait">
      <Outlet />
    </AnimatePresence>
  </>
);

const router = createBrowserRouter([
  {
    element: <AppLayout />,
    children: [
      {
        path: "/",
        element: <Home />,
      },
      {
        path: "/about",
        element: <About /> 
      }
    ]
  },
]);

function App() {
  return <RouterProvider router = {router} />;
}

export default App;

Теперь проблема в том, что анимация работает только при первой загрузке страницы, но когда я использую навигацию в приложении, анимация больше не работает.

raffgiga21 19.04.2023 19:13

@ RaffGiga21 Это будет отдельная проблема от той, о которой вы писали здесь, и было бы лучше создать новую публикацию для этой новой и конкретной проблемы. Из того, что я видел, анимация переходов маршрутов работает с маршрутизаторами без данных и использует компонент Routes для сохранения «текущего» местоположения при переходе к «новому» местоположению. Я предлагаю создать новый пост, посвященный анимации переходов маршрута.

Drew Reese 19.04.2023 19:22

Другие вопросы по теме