React-router-dom v6

1.BrowserRouter

要放在最顶层,即所有组件的最外面;可以定义别名

 

2.Routes 

包括相对路由和链接、自动路由排名、嵌套路由和布局等功能

  

3.路由跳转

"/"开头为绝对路由,否则为相对路由

 

4.Route 

负责渲染React组件的UI

1)path属性 

始终与应用程序当前的URL匹配

2)element属性 

当遇到当前URL时,会告诉Route组件渲染哪个React组件

 

Demo中的情况:

<Route path="/" element={<Father />}>

  

5.Link

 添加一个导航栏 相当于HTML中的a标签 只能在Router内部使用

 

Demo中的情况:

<Link to="login" style={{ padding: 10 }}>

 

6.编程式跳转(useNavigate)

使用useNavigate钩子函数生成navigate对象,可以通过js代码完成路由跳转

 

Demo中的情况:

const navigate = useNavigate();

<button onClick={() => navigate('/')}>点击跳转回首页</button>

 

7. 路由传参的三种方式

1)动态路由参数(读取URL参数)  关键字:Params

在Route组件中的path属性中定义路径参数;在组件内通过useParams hook访问路径参数

 

Demo中的情况:

路由中:

<Route path="/user" element={<User />}></Route>

<Route path="/user/detail/:id" element={<Detail />}></Route>

detail文件中:

const params = useParams();

<h3>此时是用户{params.id}</h3>

user文件中:

<Link to="detail/1"></Link>

 

通常用在组件呈现时获取数据:

function Invoice() {

  let { invoiceId } = useParams();

  let invoice = useFakeFetch(`/api/invoices/${invoiceId}`);

  return invoice ? (

    <div>

      <h1>{invoice.customerName}</h1>

    </div>

  ) : (

    <Loading />

  );

}

 

2)search参数 

查询参数不需要在路由中定义

使用useSearchParams hook来访问查询参数,用法与useState类似,会返回当前对象和更改他的方法

更改searchParams时,必须传入所有查询参数,否则会覆盖已有参数

 

//路由链接(携带参数):

 <Link className="nav" to={`/b/child2?age=20&name=zhangsan`}>Child2</Link>

//接收参数方法:

import { useSearchParams } from "react-router-dom";

const [searchParams, setSearchParams] = useSearchParams();

console.log( searchParams.get(“age”)); // 20

 

3)state参数

//通过Link的state属性传递参数

 <Link

     className="nav"

     to={`/b/child2`}

     state={{ id: 999, name: "i love merlin" }} //要传递的参数写在此处

 >

    Child2

</Link>

//接收参数:

import { useLocation } from "react-router-dom";

const { state } = useLocation();

//state参数 => {id: 999, name: "i love merlin"}

//刷新也可以保留参数

 

8.嵌套路由

通过嵌套的书写Route组件 实现对嵌套路由的定义

在父组件中使用Outlet来显示匹配到的子组件,目的是作为子路由的出口

 

Demo中的情况:

父组件:<Outlet />

路由:嵌套路由的形式

<Route path="home" element={<Home />}>

       <Route path="homeSpan" element={<HomeSpan />}></Route>

       <Route path="HomeDiv" element={<HomeDiv />}></Route>

</Route>

 

 

9.默认路由

在嵌套路由中,如果URL仅匹配了父级URL,则Outlet中会显示带有index属性的路由

 

Demo中的情况:

<Route index element={<Default />}></Route>

 

 

10.全匹配路由

path值取“*”时,可以匹配任何(非空)路径,但他的优先级是最低的,一般用来设置404界面

 

Demo中的情况:

<Route path="*" element={<NotFound />}></Route>

 

11.多组路由

通常一个应用中只有一个Routes组件,但是根据实际需求也可以定义多个路由出口(比如侧边栏和主页面都要随URL变化)

<Router>

    <SideBar>

        <Routes>

            <Route></Route>

        </Routes>

    </SideBar>

    <Main>

        <Routes>

            <Route></Route>

        </Routes>

    </Main>

</Router>

 

12.重定向(Navigate)

当前在a,想重定向到b,可以通过Navigate组件进行重定向到其他路径

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

function A(){

    return (

        <Navigate to="/b" />

    )

}

 

13.后裔路由(Descendant)

在父路由路径的末尾放置一个 *,可以避免当 URL 长于父路由的路径时,父路由与 URL 不匹配,影响后代路由的显示

官网示例:

function App() {

  return (

    <Routes>

      <Route path="/" element={<Home />} />

      <Route path="dashboard/*" element={<Dashboard />} />

    </Routes>

  );

}

 

function Dashboard() {

  return (

    <div>

      <p>Look, more routes!</p>

      <Routes>

        <Route path="/" element={<DashboardGraphs />} />

        <Route path="invoices" element={<InvoiceList />} />

      </Routes>

    </div>

  );

}

Demo地址:https://stackblitz.com/edit/react-xlsspr?file=src%2FPages%2FUser.js

上一篇:在v6版本的react-router-dom中如何进行默认选择


下一篇:投稿有奖丨阿里云云服务器ECS开发实践征文活动