编程式路由导航

5.编程式路由导航

1.push和replace模式

{/* 路由模式改成replace替换 , 默认为push堆栈 */}
<Link replace to={{pathname: '/home/message/detail', state:{id:msgObj.id, title: msgObj.title}}}>{msgObj.title}</Link>

2.编程式路由导航

import React, {Component} from 'react';
import {Link, Route} from "react-router-dom";

import Detail from "./Detail";

class Message extends Component {
    state = {
        messageArr: [
            {id: '01', title: '消息1'},
            {id: '02', title: '消息2'},
            {id: '03', title: '消息3'},
        ]
    }

    pushShow = (id, title) => {
        // 编写一段代码,让其 实现跳转到Detail组件,且为push跳转
        // push跳转+携带params参数
        // this.props.history.push(`/home/message/detail/${id}/${title}`)

        // push跳转+携带search参数
        // this.props.history.push(`/home/message/detail/?id=${id}&title=${title}`)
    
        // push跳转+携带state参数
        this.props.history.push(`/home/message/detail`,{id,title})
    }

    replaceShow = (id, title) => {
        // 编写一段代码,让其 实现跳转到Detail组件,且为replace跳转
        // replace跳转+携带params参数
        // this.props.history.replace(`/home/message/detail/${id}/${title}`)

        // replace跳转+携带search参数
        // this.props.history.replace(`/home/message/detail/?id=${id}&title=${title}`)

        // replace跳转+携带state参数
        this.props.history.replace(`/home/message/detail`,{id,title})
    }

    // 后退
    back = () => {
        this.props.history.goBack()
    }
    // 前进
    forward = () => {
        this.props.history.goForward()
    }
    // 跳转
    go = () => {
        this.props.history.go(2)
    }

    render() {
        const {messageArr} = this.state
        return (
            <div>
                <ul>
                    {
                        messageArr.map(msgObj => {
                            return (
                                <li key={msgObj.id}>
                                    {/*向路由组件传递params参数*/}
                                    {/*<Link to={`/home/message/detail/${msgObj.id}/${msgObj.title}`}>{msgObj.title}</Link>*/}

                                    {/*向路由组件传递search参数*/}
                                    {/*<Link to={`/home/message/detail?id=${msgObj.id}&title=${msgObj.title}`}>{msgObj.title}</Link>*/}

                                    {/*向路由组件传递state参数*/}
                                    <Link to={{pathname: '/home/message/detail', state:{id:msgObj.id, title: msgObj.title}}}>{msgObj.title}</Link>

                                    &nbsp;<button onClick={() => {this.pushShow(msgObj.id, msgObj.title)}}>push查看</button>
                                    &nbsp;<button onClick={() => {this.replaceShow(msgObj.id, msgObj.title)}}>replace查看</button>

                                </li>
                            )
                        })

                    }
                </ul>
                <hr/>
                {/*声明接收params参数*/}
                {/*<Route path='/home/message/detail/:id/:title' component={Detail}/>*/}

                {/*search参数无需声明接收, 正常注册路由即可*/}
                {/*<Route path='/home/message/detail' component={Detail}/>*/}

                {/*state参数无需声明接收, 正常注册路由即可*/}
                <Route path='/home/message/detail' component={Detail}/>

                <button onClick={this.back}>回退</button>
                <button onClick={this.forward}>前进</button>
                <button onClick={this.go}>GO</button>
            </div>
        );
    }
}

export default Message;

3.withRouter的使用

import React, {Component} from 'react';
import {withRouter} from "react-router-dom";


class Header extends Component {

    back = () => {
        this.props.history.goBack()
    }

    forward = () => {
        this.props.history.goForward()
    }

    go = () => {
        this.props.history.go(2)
    }
    render() {
        return (
            <div className="page-header">
                <h2>React Router Demo</h2>
                 <button onClick={this.back}>回退</button>
                <button onClick={this.forward}>前进</button>
                <button onClick={this.go}>GO</button>
            </div>
        );
    }
}

// withRouter可以加工一般组件,让一般组件具备路由组件所持有的API
// withRouter的返回值是一个新组件
export default withRouter(Header);
posted @ 2021-09-03 16:43  tomjoy  阅读(207)  评论(0编辑  收藏  举报