React 基础巩固(三十九)——React-Router的基本使用
一、Router的基本使用
Router中包含了对路径改变的监听,并且会将相应的路径传递给子组件。
Router包括两个API:
-
BrowserRouter使用history模式
-
HashRouter使用hash模式(路径后面带有#号)
尝试在项目中使用HashRouter:
-
安装Router
npm install react-router-dom
-
在 index.js 中引入并使用HashRouter
import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App"; import { BrowserRouter, HashRouter } from "react-router-dom";const root = ReactDOM.createRoot(document.getElementById("root")); root.render(<React.StrictMode><HashRouter><App /></HashRouter></React.StrictMode> );
二、路由映射配置
-
Routes:包裹所有的Route,在其中匹配一个路由(Router5.x使用的是Switch组件)
-
Route:Route用于路径的匹配
- path属性:用于设置匹配到的路径
- element属性:设置匹配到路径后,渲染的组件(Router5.x使用的是component属性)
- exact:精准匹配,只有精准匹配到完全一致的路径,才会渲染对应的组件(Router6.x不再支持该属性)
-
Link和NavLink
- 通常路径的跳转是使用 Link 组件,最终会被渲染成a元素
- NavLink 是在Link基础之上增加了一些样式属性
- to 属性:用于设置跳转到的路径
尝试构建界面并配置路由映射,在App.jsx中引入Home和About组件,并通过Routes、Route、Link实现简单的路由跳转:
import React, { PureComponent } from "react";
import { Route, Routes, Link } from "react-router-dom";
import Home from "./pages/Home";
import About from "./pages/About";export class App extends PureComponent {render() {return (<div className="app"><div className="header"><span>header</span><div className="nav"><Link to="/home">首页</Link><Link to="/about">关于</Link></div><hr /></div><div className="content">{/* 映射关系: path => Component */}<Routes><Route path="/home" element={<Home />} /><Route path="/about" element={<About />} /></Routes></div><div className="footer">Footer</div></div>);}
}export default App;
查看效果:
采用NavLink后,可设置active
的路由样式:
-
在src/style.css中配置active样式:
.nav .active{color: red;font-size: 18px; }
-
修改App.jsx中的Link为NavLink:
import React, { PureComponent } from "react"; import { Route, Routes, NavLink } from "react-router-dom"; import Home from "./pages/Home"; import About from "./pages/About"; import "./style.css";export class App extends PureComponent {render() {return (<div className="app"><div className="header"><span>header</span><div className="nav"><NavLink to="/home">首页</NavLink><NavLink to="/about">关于</NavLink></div><hr /></div><div className="content">{/* 映射关系: path => Component */}<Routes><Route path="/home" element={<Home />} /><Route path="/about" element={<About />} /></Routes></div><div className="footer">Footer</div></div>);} }export default App;
-
查看效果: