Я создаю приложение 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);
`;
Ссылки в 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 Это будет отдельная проблема от той, о которой вы писали здесь, и было бы лучше создать новую публикацию для этой новой и конкретной проблемы. Из того, что я видел, анимация переходов маршрутов работает с маршрутизаторами без данных и использует компонент Routes
для сохранения «текущего» местоположения при переходе к «новому» местоположению. Я предлагаю создать новый пост, посвященный анимации переходов маршрута.
Теперь проблема в том, что анимация работает только при первой загрузке страницы, но когда я использую навигацию в приложении, анимация больше не работает.