react路由02——react-routerV6 中路由表的使用(useRoutes钩子的使用 + 数据路由 createBrowserRouter API + RouterProvider 组件)

1. 不使用路由表

1.1 关于react-routerV6路由简单使用

1.2 未配置路由表

  • 先看一下未配置路由表时的项目结构情况,如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 效果,如下:
    在这里插入图片描述
    在这里插入图片描述

2. 路由表——useRoutes钩子

2.1 配置路由表

  • 配置路由表如下:
    在这里插入图片描述
    import Home from "../pages/Home"
    import Dog from "../pages/Dog"
    import Cats from "../pages/Cat/Cats"
    import CatInfo from "../pages/Cat/Info/CatInfo"
    
    export default[
        {
          
          
            path:'/',
            element:<Home/>
        },{
          
          
            path:'/dog',
            element:<Dog/>
        },{
          
          
            path:'/cats/*',
            element:<Cats/>,
            children:[
                {
          
          
    	            // path:'info',
    	           // element:<CatInfo name='张三' age={18}/>
                    path:'info/:catId/:catName',
                    element:<CatInfo name='张三' age={
          
          18}/>
                }
            ]
        }
    ]
    

2.2 一级路由组件——useRoutes钩子

  • 原路由组件做如下修改(对比原版写法看上面 1.2 未配置路由表):
    在这里插入图片描述

    import React from "react"
    import {
          
          Link,useRoutes} from 'react-router-dom'
    import './index.css'
    
    import routes from "../../routes"
    
    function PetLef(){
          
          
    
        const myRoutes = useRoutes(routes);
    
        return(
            <div>
                <div className="myMainData left" >
                    {
          
          /* 编写路由链接  靠路由链接实现切换组件 */}
                    <ul>
                        <li><Link to="/">Home</Link></li>
                        <li><Link to="/dog">狗狗信息</Link></li>
                        <li><Link to="/cats">猫咪信息</Link></li>
                    </ul>
                </div>
                <div className="myMainData right" >
                    {
          
          /* 注册路由 */}
                    {
          
          myRoutes}
                </div>
            </div>
        )
    }
    export default PetLef;
    
    • 取参数
      在这里插入图片描述

2.3 二级路由组件——Outlet组件

  • 父路由元素中应使用 <Outlet> 来呈现其子路由元素。这样就可以在呈现子路由时显示嵌套用户界面。如果父路由完全匹配,则会呈现子索引路由;如果没有索引路由,则不会呈现任何内容。
  • 原路由组件做如下修改(对比原版写法看上面 1.2 未配置路由表):
    在这里插入图片描述
    import React,{
          
          useState} from "react";
    import {
          
          Link,Outlet} from 'react-router-dom'
    
    export default function Cats(){
          
          
    
        const [cats] = useState([
            {
          
          catId:'A1001',catName:'点点'},
            {
          
          catId:'A1002',catName:'阿苔'},
            {
          
          catId:'A1003',catName:'花花'}
        ]);
        return(
            <div>
                <h2>猫咪信息</h2>
                <ul>
                    {
          
          
                        cats.map((cat)=>{
          
          
                            return(
                                <li key={
          
          cat.catId}>
                                    {
          
          /* 编写路由链接 */}
                                    {
          
          /* <Link to='info'>
                                            {cat.catId}--{cat.catName}
                                    </Link> */}
                                    <Link to={
          
          `/cats/info/${
            
            cat.catId}/${
            
            cat.catName}`}>
                                            {
          
          cat.catId}--{
          
          cat.catName}
                                    </Link>
                                </li>
                            )
                        })
                    }
                </ul>
                <br /><br />
                {
          
          /* 二级路由——展示路由组件  二级路由不用useRoutes,用Outlet */}
                <Outlet/>
            </div>
        )
    }
    

2.4 目录结构

  • 如下:
    在这里插入图片描述

2.5 . 遇到的问题

2.5.1 问题1:useRoutes() may be used only……

  • 问题描述如下:
    useRoutes() may be used only in the context of a <Router> component.
    
    在这里插入图片描述
  • 问题原因
    使用路由表之后,BrowserRouter 标签,没有放在较高的位置,原项目里是放在了一个较高的组件路由里,其实应该放在更高的位置。
  • 解决问题:
    • 1⃣️ 可以将 BrowserRouter 标签放到App.js中,如下:
      在这里插入图片描述
    • 2⃣️ 当然也可以直接放到项目的入口位置,index.js 中,如下:
      在这里插入图片描述

3. 数据路由器——V6.4 Data APIs:

3.1 简单说明

  • 如下:
    在这里插入图片描述

3.2 createBrowserRouter API + RouterProvider 组件

3.2.1 官网例子

  • 如下:
    在这里插入图片描述

3.2.2 改写项目例子

3.2.2.1 项目设计简单说明

  • 如下:
    在这里插入图片描述
    在这里插入图片描述

3.2.2.2 改写后的目录结构

  • 如下:
    在这里插入图片描述

3.2.2.3 路由配置

  • 如下:
    在这里插入图片描述

    
    import Dog from "../pages/Dog"
    import Cats from "../pages/Cat/Cats"
    import CatInfo from "../pages/Cat/Info/CatInfo"
    import LayOut from "../pages/Layout/index.jsx"
    import UserInfo from "../pages/Layout/UserInfo.jsx"
    import OrganInfo from "../pages/Layout/OrganInfo.jsx"
    import Login from "../pages/Login"
    import About from "../pages/About"
    
    import {
          
           createBrowserRouter } from "react-router-dom"
    
    const myRouter = createBrowserRouter([
        {
          
          
            path:'/',
            element:<LayOut/>,
            children:[
                {
          
          
                    path:'user',
                    element:<UserInfo/>,
                },{
          
          
                    path:'organ',
                    element:<OrganInfo/>,
                },{
          
          
                    path:'/dog',
                    element:<Dog/>
                },{
          
          
                    path:'/cats/*',
                    element:<Cats/>,
                    children:[
                        {
          
          
                            path:'info/:catId/:catName',
                            element:<CatInfo name='张三' age={
          
          18}/>
                        }
                    ]
                }
            ]
        },{
          
          
            path:'/login',
            element: <Login/>
        },{
          
          
            path:'/about',
            element: <About/>
        }
        
    ])
    
    export default myRouter;
    

3.2.2.4 效果展示

  • 如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

3.2.2.5 其他核心代码

  • App.js + index.js (入口)
    在这里插入图片描述
  • Layout-index.jsx + cats.jsx + organInfo.jsx
    在这里插入图片描述
    • Layout-index.jsx,如下:

      import {
              
               Outlet } from "react-router-dom";
      import {
              
               Link } from "react-router-dom";
      import './index.css'
      
      const LayOut = ()=>{
              
              
          return (
              <div>
                  <div className="myMainData left" >
                      {
              
              /* 展示一级路由 */}
                      <ul>
                          <li><Link to="/user">用户信息</Link></li>
                          <li><Link to="/organ">机构信息</Link></li>
      
                          {
              
              /* <li><Link to="/home">Home</Link></li> */}
                          <li><Link to="/dog">狗狗信息</Link></li>
                          <li><Link to="/cats">猫咪信息</Link></li>
                      </ul>
                  </div>
      
                  <div className="myMainData right" >
                      {
              
              /* 展示二级路由 */}
                      <Outlet/>
                  </div>
              </div>
          )
      }
      
      export default LayOut;
      
    • cats.jsx,如下:

      import React,{
              
              useState} from "react";
      import {
              
              Link,Outlet} from 'react-router-dom'
      
      export default function Cats(){
              
              
      
          const [cats] = useState([
              {
              
              catId:'A1001',catName:'点点'},
              {
              
              catId:'A1002',catName:'阿苔'},
              {
              
              catId:'A1003',catName:'花花'}
          ]);
          return(
              <div>
                  <h2>猫咪信息</h2>
                  <ul>
                      {
              
              
                          cats.map((cat)=>{
              
              
                              return(
                                  <li key={
              
              cat.catId}>
                                      {
              
              /* 编写路由链接 */}
                                      <Link to={
              
              `/cats/info/${
                
                cat.catId}/${
                
                cat.catName}`}>
                                              {
              
              cat.catId}--{
              
              cat.catName}
                                      </Link>
                                  </li>
                              )
                          })
                      }
                  </ul>
                  <br /><br />
                  {
              
              /* 三级路由  猫猫的详细信息 */}
                  <Outlet/>
              </div>
          )
      }
      
    • organInfo.jsx,如下:

      const OrganInfo = ()=>{
              
              
          return(
              <div>机构信息</div>
          )
      }
      
      export default OrganInfo;
      

3.3

4. 编程式导航

4.1 组件之间简单跳转(无参数)

  • 代码如下:
    在这里插入图片描述

    import {
          
           useNavigate } from "react-router-dom";
    
    const UserInfo = ()=>{
          
          
    
        const navigate = useNavigate();//返回的是一个函数
    
        const goToOrganInfo = ()=>{
          
          
            //跳转 到机构信息
            navigate('/organ');
        } 
    
        const login = ()=>{
          
          
            //跳转到登录页面
            navigate('/login');
        }
    
        return(
            <div>
                用户信息
                <br />
                <button onClick={
          
          goToOrganInfo}>回到机构信息</button>
    
                <br />
    
                <button onClick={
          
          login}>登录/重新登录</button>
            </div>
        )
    }
    
    export default UserInfo;
    
  • 效果如下:
    在这里插入图片描述

4.2 组件之间简单跳转(有参数)

4.2.1 params参数

  • 代码如下:
    在这里插入图片描述

  • 添加的核心代码就是:

    import {
          
          Link,Outlet,useNavigate} from 'react-router-dom'
    
        const navigate = useNavigate();
        const catDetails = (cat)=>{
          
          
            navigate(`info/${
            
            cat.catId}/${
            
            cat.catName}`);
        }
    
    
    <button onClick={
          
          ()=>catDetails(cat)}>详情信息</button>
    
  • 效果:
    在这里插入图片描述

4.2.2 state参数

  • 代码如下:
    在这里插入图片描述
    import {
          
          Link,Outlet,useNavigate} from 'react-router-dom'
    
        const navigate = useNavigate();
        const catDetails = (cat)=>{
          
          
            navigate('info',{
          
          
                replace: false,
                state:{
          
          
                    catId:cat.catId,
                    catName:cat.catName
                }
            });
        }
        
        <button onClick={
          
          ()=>catDetails(cat)}>详情信息</button>
    
  • 注意点:
    • 接参数方式要改
      在这里插入图片描述
    • 不需要占位了
      在这里插入图片描述

5. 附项目

猜你喜欢

转载自blog.csdn.net/suixinfeixiangfei/article/details/132896551