react路由1:安裝和兩種模式
npm i react-router-dom
- 兩種模式
- Router:所有路由組件的根組件,包裹路由的最外層容器
- Link:跳轉(zhuǎn)路由組件
- Routes :用于定義和渲染路由規(guī)則( 用于替換 Switch 組件)
- Route:路由規(guī)則匹配組件,顯示當(dāng)前規(guī)則對應(yīng)的組件
- exact => 精確匹配,只有當(dāng) path 和 pathname 完全匹配時才會展示該路由
import React from 'react';
// import { BrowserRouter as Router, Link, Route, Routes } from 'react-router-dom';
import { HashRouter as Router, Link, Route, Routes } from 'react-router-dom';
const Home = () => <h1>Home</h1>;
const About = () => <h1>About</h1>;
const App = () => {
return (
<Router>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
</ul>
</nav>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Router>
);
};
export default App;
react路由2:兩種路由跳轉(zhuǎn) ( 命令式與編程式)
2-1 路由跳轉(zhuǎn)-命令式
import React from 'react';
// import { BrowserRouter as Router, Link, Route, Routes } from 'react-router-dom';
import { HashRouter as Router, Link, Route, Routes } from 'react-router-dom';
const Home = () => <h1>Home</h1>;
const About = () => <h1>About</h1>;
const App = () => {
return (
<Router>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
</ul>
</nav>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Router>
);
};
export default App;
2-2 路由跳轉(zhuǎn)-編程式 - 函數(shù)組件
2-2-1 app.jsx
import React, { Component } from 'react';
import { HashRouter as Router, Route, Routes } from 'react-router-dom';
import About from "./page/About";
import Home from "./page/Home";
export default class App extends Component {
state = {
}
render(){
return (
<Router>
<Routes>
<Route path="/" element={ <Home />} />
<Route path="/about" element={ <About />} />
</Routes>
</Router>
)
}
}
2-2-2 page / Home.jsx
import React from 'react';
import { useNavigate } from 'react-router-dom';
const Home = () => {
const navigate = useNavigate();
const goToAbout = () => {
navigate('/about');
}
return (
<div>
<h1>Home</h1>
<button onClick={goToAbout}>Go to About</button>
</div>
)
}
export default Home;
2-2-3 page / About.jsx
import React from 'react';
import { useNavigate } from 'react-router-dom';
const About = () => {
const navigate = useNavigate();
const goToAbout = () => {
navigate('/');
}
return (
<div>
<h1>About</h1>
<button onClick={goToAbout}>Go to Home</button>
</div>
)
}
export default About;
2-2-4 效果
文章來源:http://www.zghlxwxcb.cn/news/detail-662000.html
react路由3:函數(shù)式組件-編程式導(dǎo)航傳遞參數(shù)
3-1 app.jsx
import React, { Component } from 'react';
import { HashRouter as Router, Route, Routes } from 'react-router-dom';
import About from "./page/About";
import Home from "./page/Home";
export default class App extends Component {
state = {
}
render(){
return (
<Router>
<Routes>
<Route path="/" element={<Home/>} />
{/* 精確匹配:只有當(dāng) path 和 pathname 完全匹配時才會展示該路由 */}
<Route exact path="/about" element={ <About/> } />
</Routes>
</Router>
)
}
}
3-2 Home.jsx
import React from 'react';
import { useNavigate } from 'react-router-dom';
const Home = () => {
const navigate = useNavigate();
const goToAbout = () => {
// 向about頁面 01:傳遞search參數(shù)數(shù)據(jù),拼接再url中=> /about?name=homeName ; 02:傳遞state=> 自定義數(shù)據(jù)
navigate('/about?name=homeName&code=001',{ state: {key:'來自home傳遞'} });
}
return (
<div>
<p>Home</p>
<button onClick={goToAbout}>Go to About</button>
</div>
)
}
export default Home;
3-3 About.jsx
import React from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
const About = () => {
const navigate = useNavigate();
const location = useLocation();
// 當(dāng)前about頁面 接受 home頁面?zhèn)鬟f的參數(shù)
console.log('location',location,"location.state",location.state); // location.state {key: '來自home傳遞'}
const searchParams = new URLSearchParams(location.search);
const param1 = searchParams.get('name');
const param2 = searchParams.get('code');
console.log('param1',param1,'param2',param2); // param1 homeName param2 001
const goToAbout = () => {
navigate('/');
}
return (
<div>
<p>About - key {location.state.key} </p>
<button onClick={goToAbout}>Go to Home</button>
</div>
)
}
export default About;
react路由4:路由重定向
- 使用
Navigate 組件實現(xiàn)重定向 , 匹配到 path="*" 需要放置再最后一個
app.jsx
<Route path="*" element={<Navigate to="/" />} />
import React, { Component } from 'react';
import { HashRouter as Router, Navigate, Route, Routes } from 'react-router-dom';
import About from "./page/About";
import Home from "./page/Home";
import Test from "./page/Test";
export default class App extends Component {
state = {
}
render(){
return (
<Router>
<Routes>
<Route path="/" element={<Home/>} />
{/* 精確匹配:只有當(dāng) path 和 pathname 完全匹配時才會展示該路由 */}
<Route exact path="/about" element={ <About/> } />
<Route exact path="/test" element={ <Test/> } />
<Route path="*" element={<Navigate to="/" />} />
</Routes>
</Router>
)
}
}
react路由5:嵌套路由,layout組件、路由懶加載
index.jsx 入口文件
import React from 'react';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';
import App from "./App";
import store from "./store/index.js";
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<Provider store={store}>
<App />
</Provider>
);
app.js 和 app.css
import React, { Suspense } from "react";
import { HashRouter as Router, Navigate, Route, Routes } from 'react-router-dom';
import "./app.css";
import routes from "./router/index";
const renderRoutes = (routes) => {
return routes.map((route, index) => {
const { path, element, children } = route;
return (
<Route
key={index}
path={path}
element={element}
>
<Route index element={<Navigate to="/home" replace />} />
{children && renderRoutes(children)}
</Route>
);
});
};
export default function App() {
return (
<div id="app">
<Router>
<Suspense fallback={<div>Loading...</div>}>
<Routes>
{renderRoutes(routes)}
<Route path="*" element={<Navigate to="/home" />} />
</Routes>
</Suspense>
</Router>
</div>
);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html,body,#root,#app{
height: 100vh;
}
body {
font-family: sans-serif;
overflow: hidden;
}
router / index.js
import { lazy } from "react";
import { Navigate } from "react-router-dom";
const Layout = lazy(() => import("../5react路由/page/Layout"))
const Home = lazy(() => import("../5react路由/page/Home"))
const About = lazy(() => import('../5react路由/page/About'))
const Test = lazy(() => import("../5react路由/page/Test"))
const News = lazy(() => import("../5react路由/page/Form/News"))
const Form = lazy(() => import("../5react路由/page/Form/Form"))
const routes = [
{
path:"/",
element: <Layout />,
children:[
{ // 用于重定向到 home page
index: true,
element: <Navigate to="/home" replace />
},
{
path: 'home',
element: <Home/>
},
{
path: 'about',
element: <About/>,
exact:true ,// 精準(zhǔn)匹配
},
{
path: 'test',
element: <Test/>,
exact:true // 精準(zhǔn)匹配
}
]
},
{
path: 'form',
element: <Form/>,
// exact:true ,// 精準(zhǔn)匹配
children: [
{
index: true,
element: <Navigate to="/form/news" replace />
},
{
path: 'news',
element: <News/>,
}
]
},
]
export default routes
page / layout.jsx h5的layout組件
import React from 'react';
import { Outlet, useNavigate } from 'react-router-dom';
import styled from 'styled-components';
const footerList = [
{ path:"/home",name:'首頁',key:'home' },
{ path:"/about",name:'關(guān)于',key:'about' },
{ path:"/test",name:'測試',key:'test' }
]
const AppWrap = styled.div`
background: #eee;
height: 100vh;
.header {
height: 32px;
line-height: 32px;
background: #ddd;
}
.main {
margin-bottom:32px;
background: #eee;
height: calc(100% - 64px);
}
.footer {
position: fixed;
bottom:0;
left:0;
width:100%;
display: flex;
justify-content: center;
align-items: center;
.footer-item {
height: 32px;
line-height: 32px;
color: #fff;
flex: 1;
text-align: center;
background: #ccc;
}
}
`;
export default function Layout(props) {
const navigate = useNavigate()
const goToPage = (item) => {
console.log('goToPage', item.path);
navigate(item.path)
}
return (
<AppWrap>
<div className='header'>header</div>
<div className='main'><Outlet/></div>
<div className='footer'>
{
footerList.map(item => {
return (
<div className='footer-item' key={item.key} onClick={()=>{goToPage(item)}}>{item.name}</div>
)
})
}
</div>
</AppWrap>
)
}
page / Home.jsx
import React from 'react';
const Home = () => {
return (
<div>
<p>home首頁Home</p>
</div>
)
}
export default Home;
page / About.jsx
import React from 'react';
import { useNavigate } from 'react-router-dom';
const About = () => {
const navigate = useNavigate();
const goToForm = () =>{
navigate('/form');
}
return (
<div>
<p>About</p>
<button onClick={goToForm}>Go to form</button>
</div>
)
}
export default About;
page / Test.jsx
import React from 'react';
import { useNavigate } from 'react-router-dom';
const Test = () => {
const navigate = useNavigate();
const goToReset = () =>{
navigate('/aaaa');
}
const goToNews = () =>{
navigate('/form/news');
}
return (
<div>
<p>Test</p>
<button onClick={goToReset}>Go to 重定向</button>
<button onClick={goToNews}>Go to News</button>
</div>
)
}
export default Test;
page / form / form.jsx 使用Outlet 渲染子路由
import React from 'react';
import { Outlet, useNavigate } from 'react-router-dom';
const Form = () => {
const navigate = useNavigate();
const goToHome = () =>{
navigate('/home');
}
return (
<div>
<Outlet />
<button onClick={goToHome}>Go to Home</button>
</div>
)
}
export default Form;
page / form / News/jsx
import React from 'react';
import { useNavigate } from 'react-router-dom';
const News = () => {
const navigate = useNavigate();
const goToReset = () =>{
navigate('/bbb');
}
return (
<div>
<p>News</p>
<button onClick={goToReset}>Go to 重定向</button>
</div>
)
}
export default News;
效果
文章來源地址http://www.zghlxwxcb.cn/news/detail-662000.html
到了這里,關(guān)于react 11之 router6路由 (兩種路由模式、兩種路由跳轉(zhuǎn)、兩種傳參與接收參數(shù)、嵌套路由,layout組件、路由懶加載)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!