记录一次withRouter的实际应用场景

在项目中经常会使用到面包屑,

所以想结合antDesign里面的Breadcrumb做一次封装

封装后的面包屑能完成路由的跳转

但是作为独立的组件  Breadcrumb是拿不到路由信息的

如果每次在页面组件去传递又略显麻烦

所以在React-router的官网中,找到了React Router中提供的withRouter方法

withRouter的作用有点类似于Redux中的connect,把要获取路由信息的组件传入with-Router,withRouter会把路由信息传递给该组件,并会返回一个新的组件,来方便其他地方调用

import React, { ReactNode } from 'react';
import { Breadcrumb } from 'antd';
import { Link ,HashRouter,withRouter} from 'react-router-dom';

const BreadcrumbCustom = (props) => {
    const { breads } = props;
    const firstPageBtn = (props)=>{
      let { history } = props;
      console.log('history=========>',history);
      return(
         <span onClick={()=>{history.goBack()}}>首页</span>
      )
    };
    const FirstPageBtn = withRouter(firstPageBtn);
    console.log('FirstPageBtn=========>',FirstPageBtn)
    return (
        <Breadcrumb style={{ margin: '12px 0' }}>
            <Breadcrumb.Item>
                <FirstPageBtn/>
            </Breadcrumb.Item>
            {breads.map((bread, i) => (
                <Breadcrumb.Item key={i}>{bread}</Breadcrumb.Item>
            ))}
        </Breadcrumb>
    );
};

export default BreadcrumbCustom;
import React from "react";
import BreadcrumbCustom from "../../../components/BreadcrumbCustom/BreadcrumbCustom";

const ReactTech = (props)=>{
    console.log(props)
    return (
        <div className='ReactTech'>
            <BreadcrumbCustom breads={['技术','react']}/>
            ReactTech
        </div>
    )
};
export default ReactTech;

 

 尽管这样做,已经实现了点击首页能跳转;

但是将来出现四级,五级页面的时候,就需要做到点击任何一个面包屑都能实现路由跳转

于是我想把history传到外面来,于是改进一下代码
 

const BreadcrumbCustom = (props) => {
    const [History,setHistory] = useState(null);
    const { breads } = props;
    const firstPageBtn = (props)=>{
      let { history } = props;
        setHistory(history);
      console.log('history=========>',history);
      return(
         <span onClick={()=>{history.goBack()}}>首页</span>
      )
    };
    const FirstPageBtn = withRouter(firstPageBtn);
    console.log('FirstPageBtn=========>',FirstPageBtn)
    return (
        <Breadcrumb style={{ margin: '12px 0' }}>
            <Breadcrumb.Item>
                <FirstPageBtn/>
            </Breadcrumb.Item>
            {breads.map((bread, i) => (
                <Breadcrumb.Item key={i} onClick={()=>{History.push('/business$/richText')}}>{bread}</Breadcrumb.Item>
            ))}
        </Breadcrumb>
    );
};

但是这个方法似乎不太高级,所以我觉得用Hook来试试:

Router 5.x中新增加了Router Hooks

1)useHistory调用该Hook会返回history对象。

2)useLocation调用该Hook会返回location对象。

3)useRouteMatch调用该Hook会返回match对象。

4)useParams调用该Hook会返回match对象中的params,也就是path传递的参数。

import React, {ReactNode, useState} from 'react';
import { Breadcrumb } from 'antd';
import { Link ,HashRouter,withRouter,useHistory} from 'react-router-dom';


const BreadcrumbCustom = (props) => {
    const History = useHistory();
    const { breads } = props;
    const firstPageBtn = (props)=>{
      let { history } = props;
      console.log('history=========>',history);
      return(
         <span onClick={()=>{history.goBack()}}>首页</span>
      )
    };
    const FirstPageBtn = withRouter(firstPageBtn);
    console.log('FirstPageBtn=========>',FirstPageBtn)
    return (
        <Breadcrumb style={{ margin: '12px 0' }}>
            <Breadcrumb.Item>
                <FirstPageBtn/>
            </Breadcrumb.Item>
            {breads.map((bread, i) => (
                <Breadcrumb.Item key={i} onClick={()=>{History.push('/business$/richText')}}>{bread}</Breadcrumb.Item>
            ))}
        </Breadcrumb>
    );
};

export default BreadcrumbCustom;

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值