我用react-routeruseNavigate在页面之间切换.使用CSSTransition,我想在页面之间进行平滑的过渡.不幸的是,它没有按预期工作,路由立即删除当前页面,并创建两次新页面,然后在这两个相同页面上执行转换.

App.js

import "./styles.css";
import "bootstrap/dist/css/bootstrap.min.css";
import {
  BrowserRouter,
  Router,
  Route,
  Routes,
  useLocation
} from "react-router-dom";
import { TransitionGroup, CSSTransition } from "react-transition-group";
import { Nav, Navbar, NavDropdown } from "react-bootstrap";
import { useNavigate } from "react-router-dom";

import Settings from "./Settings";
import TestPage from "./TestPage";

function App() {
  const location = useLocation();
  const navigate = useNavigate();

  return (
    <div className="App">
      <Navbar collapseOnSelect expand="lg" bg="dark" variant="dark">
        <Navbar.Brand href="#home">Blaa</Navbar.Brand>
        <Navbar.Toggle aria-controls="responsive-navbar-nav" />
        <Navbar.Collapse id="responsive-navbar-nav">
          <Nav className="mr-auto">
            <Nav.Link onClick={() => navigate("/settings")}>Settings</Nav.Link>
            <Nav.Link onClick={() => navigate("/testPage")}>TestPage</Nav.Link>
          </Nav>
        </Navbar.Collapse>
      </Navbar>

      <TransitionGroup component={null}>
        <CSSTransition key={location.key} classNames="fade" timeout={3000}>
          <Routes>
            <Route path="/settings" element={<Settings />} />
            <Route path="/testPage" element={<TestPage />} />
          </Routes>
        </CSSTransition>
      </TransitionGroup>
    </div>
  );
}

const Root = () => (
  <BrowserRouter basename={window.location.pathname.replace(/(\/[^/]+)$/, "")}>
    <div className="App">
      <App />
    </div>
    <br />
  </BrowserRouter>
);

export default Root;

以下是代码:https://codesandbox.io/s/cool-moon-l99ogc

这种方法有什么问题?我找不到解决办法.

推荐答案

location传递给Routes组件.

function App() {
  const location = useLocation();
  const navigate = useNavigate();

  return (
    <div className="App">
      <Navbar collapseOnSelect expand="lg" bg="dark" variant="dark">
        <Navbar.Brand href="#home">Blaa</Navbar.Brand>
        <Navbar.Toggle aria-controls="responsive-navbar-nav" />
        <Navbar.Collapse id="responsive-navbar-nav">
          <Nav className="mr-auto">
            <Nav.Link onClick={() => navigate("/settings")}>Settings</Nav.Link>
            <Nav.Link onClick={() => navigate("/testPage")}>TestPage</Nav.Link>
          </Nav>
        </Navbar.Collapse>
      </Navbar>

      <TransitionGroup component={null}>
        <CSSTransition key={location.key} classNames="fade" timeout={3000}>
          <Routes
            location={location} // <-- Pass location prop
          >
            <Route path="/settings" element={<Settings />} />
            <Route path="/testPage" element={<TestPage />} />
          </Routes>
        </CSSTransition>
      </TransitionGroup>
    </div>
  );
}

Edit react-csstransition-creates-new-page-twice-and-runs-the-transtion-on-these-two-i

Reactjs相关问答推荐

NextJS(AppRouter)、Apollo(客户端),在根布局中使用ApolloProvider时出错

Redux Provider Stuck甚至彻底遵循了文档

TypeError:SearchProduct.get()获得了意外的关键字参数查询'

使用下一步中的路由/导航不会立即加载路由

基本react 应用程序正在触发两次Use Effect

for each 子级加载父路由加载器

有没有可能在next.js和ssr中使用tsps?

无法找出状态正在被更改的位置

GitHub页面配置

获取类别和页面的参数

列表中的每个子项都应该有一个唯一的keyprops .在react 应用程序中

在Vite React上获取Amplify的环境变量

如何覆盖自定义 MUI 手风琴的样式(分隔线和折叠图标)

React v6 中的公共和私有路由

如何在 React Native 中更新跨屏幕呈现的上下文状态变量?

使用 React.UseEffect 从 api 获取但我的清理返回不起作用

如何使图标适合 react-bootstrap 中的行元素

getAttribute 函数并不总是检索属性值

使用 yarn 编译 protobuf js 时出现错误pbjs: command not found

useEffect 仅在跟随链接后有效,不适用于直接链接