react路由:路由传参params、search、state(含二级路由和三级路由)

一、准备工作:

​ 1、创建myProject05-router目录

​ 2、创建清单文件, npm init -y

​ 3、安装第三方依赖包,npm install react react-dom react-scripts react-router-dom@5 --save

​ 4、创建public文件夹,在该文件夹下创建index.html

​ 5、创建src文件夹,在该文件夹下创建:

​ (1)入口文件index.js

​ (2)组件App.js和App.css文件

​ (3)pages文件夹,在该文件夹下创建Home文件夹

​ (4)Home文件夹下创建Cates文件夹(Cates.jsx)、Goods文件夹(Goods.jsx、Goods.css、Detail文件夹(Detail.jsx))、Home.jsx、Home.css

​ (5)About.jsx、Resolve.jsx

​ 6、工程目录:

二、编写代码:

​ 1、index.html:

​ 2、index.js:

import ReactDOM from 'react-dom/client'

import App from './App'

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

const root = ReactDOM.createRoot(document.getElementById('root'))

root.render(

)

​ 3、App.js:

import React, { Component } from 'react'

import {NavLink, Redirect, Route, Switch} from 'react-router-dom'

import About from './pages/About'

import Home from './pages/Home/Home'

import Resovle from './pages/Resovle'

import './App.css'

export default class App extends Component {

render() {

return (

{/* 制作导航菜单 */}

首页

解决方案

关于我们

{/* 注册路由(其实就是路径和组件的映射关系) */}

{/* 精准匹配 */}

)

}

}

​ 4、App.css:

.app {

width: 400px;

margin: 10px auto;

}

.tabs {

display: flex;

flex-direction: rows;

}

.tabs a{

flex: auto;

padding: 10px 30px ;

background-color: #777;

color: white;

margin-right: 1px;

text-decoration: none;

}

​ 5、Home.jsx:

import React, { Component } from 'react'

import { NavLink, Redirect, Route, Switch } from 'react-router-dom'

import Cates from './Cates/Cates'

import Goods from './Goods/Goods'

import './Home.css'

export default class Home extends Component {

render() {

return (

分类

商品

{/*二级路由 - 需要在前面加上一级路由的路径才可以找到*/}

)

}

}

​ 6、Home.css:

.home {

margin-top: 10px;

display: flex;

flex-direction: rows;

height: 200px;

}

.home .left {

display: flex;

width: 120px;

flex-direction: column;

background-color: skyblue;

margin-right: 1px;

}

.home .left a {

text-decoration: none;

color: #333;

padding: 10px 0;

text-align: center;

}

.home .left .active {

background-color: orange;

}

.home .right {

flex: auto;

background-color: greenyellow;

}

​ 7、About.jsx:

import React, { Component } from 'react'

export default class About extends Component {

render() {

return (

这是关于我们内容

)

}

}

​ 8、Resovle.jsx:

import React, { Component } from 'react'

export default class Resovle extends Component {

render() {

return (

这是解决方案内容

)

}

}

​ 9、Cates.jsx:

import React, { Component } from 'react'

export default class Cates extends Component {

render() {

return (

分类组件内容

)

}

}

​ 10、Goods.css:

.goods .list{

display: flex;

justify-content: space-around;

background-color: plum;

}

.goods .list a {

text-decoration: none;

color: #333;

margin: 10px;

}

示例一:params方法传递参数:

​ 11、Goods.jsx:

import React, { Component } from 'react'

import { Link, Route } from 'react-router-dom'

import Detail from './Detail/Detail'

import './Goods.css'

export default class Goods extends Component {

state = {

googList: [

{ id: 1, title: 'AAA', desc: 'aaaaaaaaaaaaaa' },

{ id: 2, title: 'BBB', desc: 'bbbbbbbbbbbbbb' },

{ id: 3, title: 'CCC', desc: 'cccccccccccccc' }

]

}

render() {

return (

{

{/*

路由链接(携带参数): 标题

注册路由(声明接收):

接收参数:this.props.match.params

*/}

this.state.googList.map(e => {e.title})

}

{/* 三级路由 - 需要在前面加上二级路由的路径才可以找到*/}

)

}

}

​ 12、Detail.jsx:

import React, { Component } from 'react'

export default class Detail extends Component {

getDataById = id => {

const data = [

{ id: 1, title: 'AAA', desc: 'aaaaaaaaaaaaaa' },

{ id: 2, title: 'BBB', desc: 'bbbbbbbbbbbbbb' },

{ id: 3, title: 'CCC', desc: 'cccccccccccccc' }

]

return data.find(e => e.id == id)

}

render() {

const { id } = this.props.match.params

const goodsDetail = this.getDataById(id)

return (

id: {goodsDetail.id}

title: {goodsDetail.title}

desc: {goodsDetail.desc}

)

}

}

示例二:search方法传递参数:

使用search方法,获取到的是’?id=1’字符串,这时可以借助第三方包query-string(npm install query-string --save)解析url字符串。

​ eg. let {id} = queryString.parse(this.props.location.search) :把url字符串转换成对象

​ 11、Goods.jsx:

import React, { Component } from 'react'

import {Link, Route} from 'react-router-dom'

import Detail from './Detail/Detail'

import './Goods.css'

export default class Goods extends Component {

state = {

googList:[

{id:1,title:'AAA',desc:'aaaaaaaaaaaaaa'},

{id:2,title:'BBB',desc:'bbbbbbbbbbbbbb'},

{id:3,title:'CCC',desc:'cccccccccccccc'}

]

}

render() {

return (

{

{/*

路由链接(携带参数): 标题

注册路由(无需声明,正常注册即可):

接收参数:this.props.location.search

备注:获取到的search时urlencoded编码字符串,需要借助第三方包query-string解析

*/}

this.state.googList.map( e => {e.title})

}

)

}

}

​ 12、Detail.jsx:

import React, { Component } from 'react'

import queryString from 'query-string'

export default class Detail extends Component {

getDataById = id => {

const data = [

{ id: 1, title: 'AAA', desc: 'aaaaaaaaaaaaaa' },

{ id: 2, title: 'BBB', desc: 'bbbbbbbbbbbbbb' },

{ id: 3, title: 'CCC', desc: 'cccccccccccccc' }

]

return data.find(e => e.id == id)

}

render() {

let {id} = queryString.parse(this.props.location.search)

let goodsDetail = this.getDataById(id)

return (

id: {goodsDetail.id}

title: {goodsDetail.title}

desc: {goodsDetail.desc}

)

}

}

示例三:state方法传递参数:

​ 11、Goods.jsx:

import React, { Component } from 'react'

import { Link, Route } from 'react-router-dom'

import Detail from './Detail/Detail'

import './Goods.css'

export default class Goods extends Component {

state = {

googList: [

{ id: 1, title: 'AAA', desc: 'aaaaaaaaaaaaaa' },

{ id: 2, title: 'BBB', desc: 'bbbbbbbbbbbbbb' },

{ id: 3, title: 'CCC', desc: 'cccccccccccccc' }

]

}

render() {

return (

{

{/*

路由链接(携带参数): 标题

注册路由(无需声明,正常注册即可):

接收参数:this.props.location.state

备注:刷新时参数保留

*/}

// pathname -> 路径 state -> 传的id值放在state中

this.state.googList.map(e => {e.title})

}

)

}

}

​ 12、Detail.jsx:

import React, { Component } from 'react'

export default class Detail extends Component {

getDataById = id => {

const data = [

{ id: 1, title: 'AAA', desc: 'aaaaaaaaaaaaaa' },

{ id: 2, title: 'BBB', desc: 'bbbbbbbbbbbbbb' },

{ id: 3, title: 'CCC', desc: 'cccccccccccccc' }

]

return data.find(e => e.id == id)

}

render() {

// console.log(this.props.location.state);

let { id } = this.props.location.state

let goodsDetail = this.getDataById(id)

return (

id: {goodsDetail.id}

title: {goodsDetail.title}

desc: {goodsDetail.desc}

)

}

}

​ 13、运行结果静态图示例:

三、运行命令

​ npm react-scripts satrt

​ 简化版:

​ 在清单文件中添加一行命令 “start”: “react-scripts start”

​ 运行命令:npm start

"scripts": {

"start": "react-scripts start",

"test": "echo \"Error: no test specified\" && exit 1"

}

title: {goodsDetail.title}

desc: {goodsDetail.desc}