React路由

什么是前端路由

一个路径path对应一个组件component,当我们在浏览器中访问一个path的时候,path对应的组件会在页面中进行渲染
cosnt routes =[
    {path: '/home', component: Home},
    {path: '/about', component: About}
]

创建路由开发环境

使用路由,还是采用CRA创建项目的方式进行基础环境配置
1. 创建项目并安装所有依赖
    npx create-react-app react-router-demo
    npm i
2. 安装最新的ReactRouter包
    npm i react-router-dom
3. 启动项目
    npm run start
import React from 'react';
import ReactDOM from 'react-dom/client';
import {createBrowserRouter, RouterProvider } from 'react-router-dom';

// 1.创建router实例对象,并且配置路由对应关系
const router = createBrowserRouter([
    {
        path: '/',
        element: <div>hello react</div>
    },
    {
        path: '/login',
        element: <div>登录页</div>
    },
    {
        path: '/details',
        element: <div>详情页</div>
    }
])

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <div>
        {/* 2.将router渲染给react-router */}
        <RouterProvider router={router}></RouterProvider>
    </div>

);

// 3. 访问:
// http://localhost:3000/login
// http://localhost:3000/details

抽象路由模块

在page目录创建页面组件
在router目录创建路由模块
在index.js中集中引入路由模块
import Login from '../page/Login'
import Details from '../page/Details'
import Layout from '../page/Layout'
import NotFound from '../page/NotFound'

import {createBrowserRouter}  from 'react-router-dom'


const router = createBrowserRouter([
    {
        path: '/',
        element: <div>welcom</div>,
    },
    {
        path: '/login',
        element: <Login/>,
    },
    {
        path: '/details/:id/:name',
        element: <Details/>,
    },
    {
        path: '/details',
        element: <Details/>,
    },
    {
        path: '/home',
        element: <Layout/>,
        children:[
            {
                // path: 'login',
                index: true,
                element: <Login/>,
            },
            {
                path: 'details',
                element: <Details/>,
            },
        ]
    },
    {
        path: '*',
        element: <NotFound/>,
    }
])

export default router

路由导航

什么是路由导航:路由系统中的多个路由之间需要进行路由跳转,并且在跳转的同时有可能需要传递参数进行通信

声明式导航

声明式导航是指通过在模板中通过<Link/>组件描述出要跳转到哪里去,比如后台管理系统的左侧菜单通常使用这种方式进行
<Link to="/home">Home</Link>
语法说明:通过给组件的to属性指定要跳转的路由path,组件会被渲染为浏览器支持的a链接,如果需要传参直接通过字符串拼接的方式拼接参数即可
import {Link} from "react-router-dom";

const Login = () => {
    return (
        <div>这里是登录页
            {/* 声明式导航*/}
            <Link to={"/details"}>跳转到详情</Link>
        </div>
    )
}

编程式导航

编程式导航是指通过useNavigate钩子得到导航方法,然后通过调用方法以命令的形式进行路由跳转,比如想在登录请求完毕之后跳转就可以选择这种方式,更加灵活
const navigate = useNavigate()
语法说明:通过调用navigate方法传入地址path实现跳转
import {useNavigate} from "react-router-dom";

const Login = () => {
    const navigate = useNavigate()
    return (
        <div>这里是登录页
            {/* 编程式导航*/}
            <button onClick={() => navigate('/details')}>跳转</button>
        </div>
    )
}

导航传参

searchParams传参

1. 传参
navigate('/details?id=123&username=tom')
2. 获取传参
let [params] = useSearchParams()
let id = params.get('id')

传参

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

const Login = () => {
    const navigate = useNavigate()
    return (
        <div>这里是登录页
            {/* searchParams传参*/}
            <button onClick={() => navigate('/details?id=1&name=macy')}>跳转</button>
        </div>
    )
}

取参

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

const Details = () => {
    // useSearchParams取路由参数
    const [params] = useSearchParams()
    let id = params.get("id");
    let name = params.get("name")

    return (
        <div>
            这里是详情页:{id}---{name}
        </div>
    )
}

params传参

1.传参
navigate('/details/123)
2. 在路由模块设置路由占位符
{
    path: '/details/:id/:name',
    element: <Details/>,
},
3. 获取传参
const params = useParams()
let id = params.id

传参

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

const Login = () => {
    const navigate = useNavigate()
    return (
        <div>这里是登录页
            {/* params传参*/}
            <button onClick={() => navigate('/details/1/macy')}>跳转</button>
        </div>
    )
}

配置占位符

const router = createBrowserRouter([
    {
        path: '/',
        element: <div>Welcome</div>,
    },
    {
        path: '/login',
        element: <Login/>,
    },
    {
        path: '/details/:id/:name',
        element: <Details/>,
    },
])

取参

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

const Details = () => {
    // params取路由参数
    const params2 = useParams()
    let id2 = params2.id
    let name2 = params2.name
    return (
        <div>
            <div>这里是详情页====:{id2}---{name2}</div>
        </div>
    )
}

嵌套路由配置

在一级路由中有内嵌了其他路由,这种关系叫做嵌套路由,嵌套至一级路由内的路由又称作二级路由
实现步骤:
1.使用children属性配置路由嵌套关系
{
    path: '/home',
    element: <Layout/>,
    children:[
        {
            path: 'login',
            element: <Login/>,
        },
        {
            path: 'details',
            element: <Details/>,
        },
    ]
},
2.使用Outlet组件配置二级路由渲染位置
import {Link, Outlet} from "react-router-dom";

const Layout = () => {
    return(
        <div>
            Layout组件
            <Link to="/home/login">登录页</Link>  -
            <Link to="/home/details">详情页</Link>

            {/*配置二级路由出口*/}
            <Outlet/>
        </div>
    )
}

默认二级路由

当访问的是一级路由时,默认的二级路由组件可以得到渲染,需要在二级路由的配置去掉path,设置index属性为true
{
    path: '/home',
    element: <Layout/>,
    children:[
        {
            // 设置为默认的二级路由,当访问/home时会自动渲染Login组件
            // path: 'login',
            index: true,
            element: <Login/>,
        },
        {
            path: 'details',
            element: <Details/>,
        },
    ]
},

404路由

场景:当浏览器输入url的路径在整个路由配置中都找不到对应的path,为了用户体验,可以使用404兜底组件进行渲染
实现步骤:
1. 准备一个NotFount组件
2. 在路由表数组的末尾,以*号作为路由path配置路由
    {
        path: '*',
        element: <NotFound/>,
    }

两种路由模式

各个主流框架的路由常用的路由模式有两种,history和hash模式,ReactRouter分别由createBrowerRouter和createHashRouter函数负责创建
路由模式url表现底层原理是否需要后端支持
historyurl/loginhistory对象 + pushState事件需要
hashurl/#/login监听hashChange事件不需要
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值