路由传值
-
路由包裹 App 通过 context 向 App 的子孙组件去传值
-
路由传参分为三种形式
- query 方式传值
- 传值:
to={{pathname: '/one', query: {a: 1, b: {c: 3}}}}
- 接收:
this.props.location.query
- 注意:
- 刷新数据不存在
- 默认值为 undefined,所以要做判断
this.props.location.query = this.props.location.query || {}
- 传值:
- state 方式传值
- 传值:
to={{pathname: '/Two', state: {a: 10, b: {c: 30}}}}
- 接收:
this.props.location.state
- 注意:
- 刷新数据还在(只在本选项卡内刷新数据还在),重新打开选项卡数据不在
- state 默认值为 undefined ,所以要做判断
this.props.location.state = this.props.location.state || {};
- 传值:
- 动态路由传参,params 方式接收
- 路由组件设置:两种设置方式
- 第 1 种:
path={'/three/:id/:type'}
- 第 2 种:
path={'/list/:type?'}
? 意思是 type 参数可写可不写,匹配到 list 就能渲染组件
- 第 1 种:
- 传值:
to={{pathname: '/Three/111/222'}}
- 接收:
this.props.match.params
- 注意:
- 刷新数据还在,可以接收对象
- 路由组件设置:两种设置方式
- query 方式传值
query 方式传值
- 传值:通过 NavLink 标签,to 属性,对象方式,query 参数传值,例如:
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/one', query: {a: 1, b: {c: 3}}}}>One</NavLink>
- 接收:目标组件,通过实例 props 属性,location 下的 query 接收,例如:
console.log(this.props.location.query.a)
注意:
通过 NavLink 标签,to 属性 query 传值,刷新数据不存在
所以,使用之前需要做一个判断,即:
if (this.props.location.query){console.log(this.props.location.query.a)}
或者:
this.props.location.query = this.props.location.query || {}; console.log(this.props.location.query.a)
实例说明
query 传值
to={{pathname: '/one', query: {a: 1, b: {c: 3}}}}
传值
// src/components/MyNav.jsx 组件
import React, {Component} from 'react';
import {
NavLink,
Link,
} from 'react-router-dom';
export default class MyNav extends Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
return (
<nav>
<NavLink exact className={'App-link'} activeClassName={'App-active'} to={'/'}>首页</NavLink>|
<NavLink className={'App-link'} activeClassName={'App-active'} to={'/my'}>我的</NavLink>|
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/login'}}>登录</NavLink>|
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/order'}}>订单</NavLink>|
{/* query 传值 */}
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/one', query: {a: 1, b: {c: 3}}}}>One</NavLink>
</nav>
)
}
}
props 接收
this.props.location.query
接收- 可以接收对象
// src/views/One.jsx 组件
import React, {Component} from 'react';
export default class One extends Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
return (
<div>One 组件</div>
)
}
componentDidMount() {
this.props.location.query = this.props.location.query || {};
console.log(this.props.location.query.a)
// if (this.props.location.query)
// console.log(this.props.location.query.a)
}
}
state 方式传值
- 传值:通过 NavLink 标签,to 属性,对象方式,state 参数传值,例如:
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/Two', state: {a: 10, b: {c: 30}}}}>Two</NavLink>
- 接收:目标组件,通过实例 props 属性,location 下的 state 接收,例如:
console.log(this.props.location.state.a)
注意:
通过 NavLink 标签,to 属性 state 传值,刷新数据还在(只在本选项卡内刷新数据还在),重新打开选项卡数据不在
所以,使用之前需要做一个判断,即:
if (this.props.location.state){console.log(this.props.location.state.a)}
或者:
this.props.location.state = this.props.location.state || {}; console.log(this.props.location.state.a)
实例说明
state 传值
to={{pathname: '/Two', state: {a: 10, b: {c: 30}}}}
传值- 可以接收对象
// src/components/MyNav.jsx 组件
import React, {Component} from 'react';
import {
NavLink,
Link,
} from 'react-router-dom';
export default class MyNav extends Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
return (
<nav>
<NavLink exact className={'App-link'} activeClassName={'App-active'} to={'/'}>首页</NavLink>|
<NavLink className={'App-link'} activeClassName={'App-active'} to={'/my'}>我的</NavLink>|
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/login'}}>登录</NavLink>|
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/order'}}>订单</NavLink>|
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/one', query: {a: 1, b: {c: 3}}}}>One</NavLink>|
{/* state 传值 */}
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/Two', state: {a: 10, b: {c: 30}}}}>Two</NavLink>
</nav>
)
}
}
props 接收
this.props.location.state
接收
// src/views/Two.jsx 组件
import React, {Component} from 'react';
export default class Two extends Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
return (
<div>Two 组件</div>
)
}
componentDidMount() {
this.props.location.state = this.props.location.state || {};
console.log(this.props.location.state.a);
// if (this.props.location.state)
// console.log(this.props.location.state.a);
}
}
params 路径方式(动态路由) 传值
- 传值:通过 NavLink 标签或者 Link 标签,to 属性,对象方式,路径方式 传值
- 例如:
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/Three/111/222'}}>Three</NavLink>
- 例如:
<Link to={'/goods/' + v._id + '.html'}>{v.godsName}</Link>
- 例如:
- 接收:目标组件,通过实例 props 属性,match 下的 params 接收,例如:
console.log(this.props.match.params.id)
注意:
通过 NavLink 标签,to 属性 路径方式 传值,刷新数据还在,可以接收对象
接收时,
this.props.match.params
下接收属性名,就是设置动态路由时设置的动态路由名即
path: '/goods/:id.html',
,id 就是接收的属性名
实例说明
路由配置
// src/App.js 组件
import React from 'react';
import './App.css';
// 输入 Home 状态组件
import Home from "./views/Home";
// 输入 My 状态组件
import My from "./views/My";
// 输入 MyNav 导航
import MyNav from "./components/MyNav";
// 输入 One 组件
import One from "./views/One";
// 输入 Two 组件
import Two from "./views/Two";
// 输入 Three 组件
import Three from "./views/Three";
/*
* 输入路由 react-router-dom
* */
import {
BrowserRouter as Router, // 浏览器路由
Route, // 路径,可以对路径进行配置
NavLink, // 导航
Switch, // 按顺序匹配路由,匹配到路由停止匹配
Redirect, // 重定向
} from 'react-router-dom';
function App() {
return (
<div className="App">
<Router>
<MyNav></MyNav>
{/*<nav>
<NavLink exact className={'App-link'} activeClassName={'App-active'} to={'/'}>首页</NavLink>|
<NavLink className={'App-link'} activeClassName={'App-active'} to={'/my'}>我的</NavLink>|
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={'/login'}>登录</NavLink>|
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={'/order'}>订单</NavLink>
</nav>*/}
{/*
* patch:访问的地址,'/',默认地址
* exact:精确匹配
* component:输入组件
**/}
<Switch>
<Route path={'/'} exact={true} component={Home}></Route>
<Route path={'/my'} component={My}></Route>
<Route path={'/login'} component={() => <div>login</div>}></Route>
<Route path={'/order'} render={() => <div>订单页面</div>}></Route>
<Route path={'/one'} component={One}></Route>
<Route path={'/two'} component={Two}></Route>
{/* 配置动态路由 斜杠 */}
<Route path={'/three/:id/:type'} component={Three}></Route>
{/* ? 的意思 type 可写可不写,匹配到 /three/:id 也可以渲染组件*/}
<Route path={'/three/:id/:type?'} component={Three}></Route>
{/* 配置动态路由 横杠 */}
<Route path={'/three-:id-:type.html'} component={Three}></Route>
<Redirect to={'my'} from={'/profile'}></Redirect>
{/*<Route render={() => <div>404,您找的页面不存在</div>}></Route>*/}
<Route path={'*'} render={() => <div>404,您找的页面不存在</div>}></Route>
</Switch>
</Router>
</div>
);
}
export default App;
路径方式传值
// src/components/MyNav.jsx 组件
import React, {Component} from 'react';
import {
NavLink,
Link,
} from 'react-router-dom';
export default class MyNav extends Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
return (
<nav>
<NavLink exact className={'App-link'} activeClassName={'App-active'} to={'/'}>首页</NavLink>|
<NavLink className={'App-link'} activeClassName={'App-active'} to={'/my'}>我的</NavLink>|
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/login'}}>登录</NavLink>|
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/order'}}>订单</NavLink>|
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/one', query: {a: 1, b: {c: 3}}}}>One</NavLink>|
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/Two', state: {a: 10, b: {c: 30}}}}>Two</NavLink>|
{/* 斜杠分割传值 */}
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/Three/111/222'}}>Three</NavLink>|
{/* 横杠分割传值 */}
<NavLink className={'App-link'} activeStyle={{color: 'red'}} to={{pathname: '/Three-111-222.html'}}>Three - </NavLink>
</nav>
)
}
}
props 接收
this.props.match.params
接收
import React, {Component} from 'react';
export default class Three extends Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
return (
<div>Three 组件</div>
)
}
componentDidMount() {
console.log(this.props.match.params.id, this.props.match.params.type); // 111 222
}
}