react旧版本路由
旧版本的路由是按照组件的方式来写的
编写router/index.tsx文件
import App from "../App"
import Home from "../views/Home"
import About from "../views/About"
import { BrowserRouter,Routes,Route } from "react-router-dom"
//两种路由模式的组件,BrowserRouter(history模式), HashRouter (Hash模式)
// const baseRouter = () => {
// 如果有逻辑,才需要写return,如果没有逻辑直接reture,可以使用下面的简写
// return()
//}
const baseRouter = () => (
}>
}>
}>
)
export default baseRouter
修改main.tsx文件,引入router下的首页组件
import React from 'react'
import ReactDOM from 'react-dom/client'
//正确的样式引入顺序
//样式初始化一般放在最前面,引用reset-css
import "reset-css"
//UI框架的样式一般放在组件样式之前
//import XXXX
//全局样式
import "@/assets/styles/global.scss"
//组件的样式
//import App from './App'
import Router from "./router"
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
,
)
修改App.tsx
import { useState } from 'react'
import Comp1 from "@/components/Comp1/index"
import Comp2 from "@/components/Comp2/index"
import { Button, Space } from 'antd';
import {PlayCircleOutlined} from '@ant-design/icons';
import {Outlet} from "react-router-dom"
function App() {
const [count, setCount] = useState(0)
return (
我的React项目
{/* 占位符组件,类似窗口,用来展示组件的,有点像vue中的router-view*/}
)
}
路由链接
引入Link组件,并修改App.tsx文件
import { useState } from 'react'
import Comp1 from "@/components/Comp1/index"
import Comp2 from "@/components/Comp2/index"
import { Button, Space } from 'antd';
import {PlayCircleOutlined} from '@ant-design/icons';
import {Outlet, Link} from "react-router-dom"
function App() {
const [count, setCount] = useState(0)
return (
我的React项目
Home
About
首页
{/* 占位符组件,类似窗口,用来展示组件的,有点像vue中的router-view*/}
)
}
路由重定向
修改router/index.tsx文件,引入Navigate组件,并配置重定向
import App from "../App"
import Home from "../views/Home"
import About from "../views/About"
import { BrowserRouter,Routes,Route,Navigate } from "react-router-dom"
//两种路由模式的组件,BrowserRouter(history模式), HashRouter (Hash模式)
// const baseRouter = () => {
// 如果有逻辑,才需要写return,如果没有逻辑直接reture,可以使用下面的简写
// return()
//}
const baseRouter = () => (
}>
{/*配置用户访问/的时候,重定向到/home路径 */}
}>
}>
}>
)
react新版本路由
新版本采用对象形式的写法
修改router/index.tsx
import Home from "../views/Home"
import About from "../views/About"
import { Navigate } from "react-router-dom"
const routes = [
{
path:"/",
element:
},
{
path:"/home",
element:
},
{
path:"/about",
element:
}
]
export default routes
修改main.tsx,引入BrowserRouter组件,用回App顶级组件
import React from 'react'
import ReactDOM from 'react-dom/client'
import "reset-css"
import "@/assets/styles/global.scss"
import { BrowserRouter } from "react-router-dom"
import App from './App'
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
)
修改App.tsx,换成hook形式的对象,引入useRoutes库,实例化一个useRoutes对象outlet,最终展示该对象outlet
import { useState } from 'react'
import {useRoutes, Link} from "react-router-dom"
import router from "./router"
function App() {
const [count, setCount] = useState(0)
const outlet =useRoutes(router)
return (
我的React项目
Home
About
首页
{/* 占位符组件,类似窗口,用来展示组件的,有点像vue中的router-view*/}
{outlet}
)
}
export default App
路由的懒加载
修改router/index.tsx,引入react库中的lazy,定义一个About对象,实例化lazy函数
import { lazy } from "react"
import Home from "../views/Home"
//import About from "../views/About"
import { Navigate } from "react-router-dom"
const About = lazy(()=>import ("../views/About"))
//懒加载的模式的组件写法,外面需要套一层loading的提示加载组件
const routes = [
{
path:"/",
element:
},
{
path:"/home",
element:
},
{
path:"/about",
element:
Loading...
自定义Loading方法
定义一个Loading函数封装loading组件,引入React库,定义withLoadingComponent组件,设置组件变量为一个JSX.Element对象。
import React,{ lazy } from "react"
import Home from "../views/Home"
//import About from "../views/About"
import User from "../views/User"
import { Navigate } from "react-router-dom"
const About = lazy(()=>import ("../views/About"))
//懒加载的模式的组件写法,外面需要套一层loading的提示加载组件
//定义一个Loading函数
const withLoadingComponent = (comp:JSX.Element) =>{
return (
Loading...