React-Router路由传参详细 #逆战班

路由传值

  • 路由包裹 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 就能渲染组件
      • 传值:to={{pathname: '/Three/111/222'}}
      • 接收:this.props.match.params
      • 注意:
        • 刷新数据还在,可以接收对象

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
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值