首页 > 其他分享 >如何使用React Router--01

如何使用React Router--01

时间:2024-08-14 17:48:39浏览次数:11  
标签:function 01 return -- React Router import 路由

一、React Router 基础

1.1 安装 React Router

要在项目中使用 React Router,首先需要安装:

npm install react-router-dom

 

安装完成后,你可以在应用中使用 BrowserRouterRouteSwitch 等组件来实现路由功能。

1.2 基本路由配置

最简单的路由配置通常包含以下几个部分:

  • BrowserRouter:用于包裹整个应用,提供路由功能。
  • Route:定义路径和对应的组件,当路径匹配时渲染对应组件。
  • Switch:确保一次只渲染一个路由。

代码如下:

import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

function Home() {
  return <h2>Home</h2>;
}

function About() {
  return <h2>About</h2>;
}

function App() {
  return (
    <Router>
      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/about" component={About} />
      </Switch>
    </Router>
  );
}

export default App;

 

 

  • exact:确保路径精确匹配,例如,只有当路径完全是 '/' 时才会渲染 Home 组件。
1.3 链接与导航

使用 Link 组件创建导航链接,它会渲染一个普通的 <a> 标签,但点击时不会触发页面刷新,而是通过 React Router 实现路由跳转。

import { Link } from 'react-router-dom';

function Navbar() {
  return (
    <nav>
      <ul>
        <li>
          <Link to="/">Home</Link>
        </li>
        <li>
          <Link to="/about">About</Link>
        </li>
      </ul>
    </nav>
  );
}

二、React Router 高级功能

2.1 动态路由

在实际开发中,经常需要基于动态参数来渲染组件,比如用户详情页。React Router 提供了动态路由功能,允许通过 URL 参数传递信息。

function User({ match }) {
  return <h2>User ID: {match.params.id}</h2>;
}

function App() {
  return (
    <Router>
      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/user/:id" component={User} />
      </Switch>
    </Router>
  );
}

 

在上述代码中,:id 是一个动态参数,可以通过 match.params.id 访问它。

2.2 嵌套路由

嵌套路由允许你在一个组件内部定义子路由,从而实现模块化路由配置。

function Dashboard({ match }) {
  return (
    <div>
      <h2>Dashboard</h2>
      <ul>
        <li>
          <Link to={`${match.url}/profile`}>Profile</Link>
        </li>
        <li>
          <Link to={`${match.url}/settings`}>Settings</Link>
        </li>
      </ul>

      <Route path={`${match.path}/profile`} component={Profile} />
      <Route path={`${match.path}/settings`} component={Settings} />
    </div>
  );
}

 

在这个例子中,Dashboard 组件内部的 ProfileSettings 都是子路由。

2.3 路由守卫

路由守卫用于控制路由的访问权限,例如,只有登录用户才能访问某些页面。React Router 提供了 Redirect 组件来实现这一功能。

function PrivateRoute({ component: Component, ...rest }) {
  const isAuthenticated = fakeAuth.isAuthenticated; // 示例中的认证逻辑
  return (
    <Route
      {...rest}
      render={props =>
        isAuthenticated ? (
          <Component {...props} />
        ) : (
          <Redirect to="/login" />
        )
      }
    />
  );
}

function App() {
  return (
    <Router>
      <Switch>
        <Route path="/login" component={Login} />
        <PrivateRoute path="/dashboard" component={Dashboard} />
      </Switch>
    </Router>
  );
}

 

在这里,PrivateRoute 组件封装了访问权限的检查逻辑,如果用户未登录,将重定向到登录页面。

2.4 使用 useHistoryuseLocation Hooks

React Router 提供了 useHistoryuseLocation 两个 Hooks,用于在函数组件中访问和控制路由历史记录和当前位置。

import { useHistory, useLocation } from 'react-router-dom';

function SomeComponent() {
  let history = useHistory();
  let location = useLocation();

  function goBack() {
    history.goBack(); // 返回上一页
  }

  return (
    <div>
      <p>Current location: {location.pathname}</p>
      <button onClick={goBack}>Go Back</button>
    </div>
  );
}

 

  • useHistory:可以用来编程式导航(例如,history.push('/somepath'))。
  • useLocation:可以访问当前的URL信息。

 


 

路由优化

 

4.1 懒加载路由

当应用变得复杂时,加载所有的组件可能会影响页面的加载速度。React 提供了 React.lazySuspense 进行组件的懒加载,可以与 React Router 结合,实现按需加载路由组件。

import React, { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

const Home = lazy(() => import('./Home'));
const About = lazy(() => import('./About'));

function App() {
  return (
    <Router>
      <Suspense fallback={<div>Loading...</div>}>
        <Switch>
          <Route exact path="/" component={Home} />
          <Route path="/about" component={About} />
        </Switch>
      </Suspense>
    </Router>
  );
}

export default App;

 

 

  • React.lazy:将组件动态加载,只有在需要时才会加载对应的组件。
  • Suspense:用于在组件加载过程中显示一个备用内容(如加载动画)。

4.2 路由配置文件化

对于大型应用,路由配置可能会非常复杂,将路由配置文件化是一个良好的实践,能够提高路由的可维护性。

 

// routes.js
import Home from './Home';
import About from './About';

const routes = [
  {
    path: '/',
    exact: true,
    component: Home,
  },
  {
    path: '/about',
    component: About,
  },
];

export default routes;

// App.js
import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import routes from './routes';

function App() {
  return (
    <Router>
      <Switch>
        {routes.map((route, index) => (
          <Route
            key={index}
            path={route.path}
            exact={route.exact}
            component={route.component}
          />
        ))}
      </Switch>
    </Router>
  );
}

export default App;

 

 

这种做法将所有路由集中在一个配置文件中,便于管理和扩展,特别是在需要动态生成路由的情况下。

4.3 处理 404 页面

在单页应用中,处理未匹配的路径非常重要,以确保用户不会访问无效的页面。可以通过添加一个匹配所有路径的 Route 来实现 404 页面。

 

function NotFound() {
  return <h2>404 - Page Not Found</h2>;
}

function App() {
  return (
    <Router>
      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/about" component={About} />
        <Route component={NotFound} />
      </Switch>
    </Router>
  );
}

export default App;

 

 

在上面的代码中,如果没有匹配到其他路径,将会渲染 NotFound 组件。

4.4 路由的权限管理

对于需要权限控制的应用,可以在 PrivateRoute 组件中添加更多的逻辑,如角色检查、权限验证等。

function PrivateRoute({ component: Component, roles, ...rest }) {
  const isAuthenticated = fakeAuth.isAuthenticated;
  const userRole = fakeAuth.userRole;

  return (
    <Route
      {...rest}
      render={(props) =>
        isAuthenticated && roles.includes(userRole) ? (
          <Component {...props} />
        ) : (
          <Redirect to="/unauthorized" />
        )
      }
    />
  );
}

 

在这种情况下,可以基于用户角色或权限来决定是否允许访问某个路由。

4.5 路由过渡动画

为了提高用户体验,可以为路由切换添加过渡动画。可以借助 react-transition-groupframer-motion 等库来实现。

import { CSSTransition, TransitionGroup } from 'react-transition-group';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

function App() {
  return (
    <Router>
      <Route
        render={({ location }) => (
          <TransitionGroup>
            <CSSTransition
              key={location.key}
              classNames="fade"
              timeout={300}
            >
              <Switch location={location}>
                <Route exact path="/" component={Home} />
                <Route path="/about" component={About} />
              </Switch>
            </CSSTransition>
          </TransitionGroup>
        )}
      />
    </Router>
  );
}

export default App;

 

通过 CSSTransitionTransitionGroup 可以为路由的进入和离开添加自定义动画。

标签:function,01,return,--,React,Router,import,路由
From: https://www.cnblogs.com/zx618/p/18359468

相关文章

  • docker-swarm test
    DockerService(服务)是用于定义和管理单个容器服务的概念。 DockerCompose,它是用来进行一个完整的应用程序相互依赖的多个容器的编排的,但是缺点是不能在分布式多机器上使用; Dockerswarm,它构建了docker集群,并且可以通过dockerservice在不同集群节点上运行容器服务,但是缺点......
  • sm2算法
    sm2算法简称国密,下面是百度讲解:SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法。随着密码技术和计算机技术的发展,目前常用的1024位RSA算法面临严重的安全威胁,我们国家密码管理部门经过研究,决定采用SM2椭圆曲线算......
  • 长度最小的子数组
    **问题**给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的子数组[numsl,numsl+1,...,numsr-1,numsr],并返回其长度。如果不存在符合条件的子数组,返回0。 **注意问题**子数组的定义:一个或连续多个数组中的元......
  • 0813day05
    #作业使用代码实现以下业务逻辑:1.输入姑娘的年龄后,进行以下判断:1.如果姑娘小于18岁,打印“未成年”2.如果姑娘大于18岁小于25岁,打印“表白”3.如果姑娘大于25岁小于45岁,打印“阿姨好”4.如果姑娘大于45岁,打印“奶奶好”age=int(input(“输入你的年龄”))......
  • 想把统计表里的数据拆散成多个报表?一文教会你如何将报表数据化整为零
    最近制作报表时遇到了个问题,怎么把整合到一起的订单统计数据拆分成一个个单独的订单统计报表呢?经过一段时间的探索后,我找到了一款完全免费的报表软件,能够解决这个问题,这款软件叫作山海鲸可视化,我会在后面贴出软件的官网网址,大家感兴趣可以自己去试试看。(官网:www.shanhaibi.com/rep......
  • OSI七层网络参考模型
    OSI(OpenSystemsInterconnection)七层网络参考模型是一个国际标准化组织(ISO)定义的网络通信模型,用于描述计算机网络系统中的数据传输过程。OSI模型将网络通信过程分为七个独立的层次,每一层都有特定的功能和协议。通过这个模型,网络通信得以标准化,使得不同系统之间可以互通。 一......
  • SQL中exists和in的用法以及区别
    SQL中exists和in的用法以及区别  目录一、in用法二、exists用法三、in与exists的区别in语句:只执行一次exists语句:执行n次(外表行数)区别和应用场景notin和notexists四、结论 一、in用法in 语法为:select*fromtable_namewherecol_namei......
  • 206 旅行商问题
    //206旅行商问题.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/14/problem/645蜗蜗的世界里有n个城市,城市两两之间通过高速公路连接,从第i个城市走到第j个城市需要花费ai,j的时间。现在蜗蜗想从1号城市出发旅......
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版获取word指定位置的值
    PageOffice国产版:支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)、龙芯longarch芯片架构。查看本示例演示效果本示例关键代码的编写位置,请参考“开始-快速上手”里您所使用的开发语言框架的最简集成代码注意本文中展示的......
  • Codeforces Round 966 (Div. 3)
    A-PrimaryTask给一个数\(x\),判断其是否形如\(\overline{ab}\)满足\(a=10,b\ge2\)且无前导零。模拟判断即可。code#include<bits/stdc++.h>usingnamespacestd;constintmaxn=3e5+3;intT;stringn;voidsolve(){ cin>>n; if((n=="1"||n=="10......