react-router5路由封装

文件目录

- src
	- pages
		About.jsx
		fail.jsx
		Home.jsx
		Home1.jsx
		Home2.jsx
	- router
		index.jsx
		routes.jsx
	- App.jsx

src/router/routes.jsx

import React, { lazy } from 'react';

const Home = lazy(() => import('../pages/Home'));
const HomeA = lazy(() => import('../pages/Home1'));
const HomeB = lazy(() => import('../pages/Home2'));
const About = lazy(() => import('../pages/About'));
const Fail = lazy(() => import('../pages/fail'));

const routes = [
  {
    path: '/',
    redirect: '/about',
    exact: true,
  },
  {
    path: '/about',
    component: About,
    exact: false,
  },
  {
    path: '/home',
    component: Home,
    exact: false,
    children: [
      {
        path: '/home/home1',
        component: HomeA,
        exact: true,
      },
      {
        path: '/home/home2',
        component: HomeB,
        exact: true,
      },
      {
        path: '/home',
        redirect: '/home/home1',
        exact: true,
      },
    ],
  },
  // 找不到路径的时候 进行匹配
  {
    path: '*',
    component: Fail,
    exact: false,
  },
];

export default routes;

src/router/index.jsx

import React, { Suspense } from 'react';
import { Redirect, Route, Switch } from 'react-router-dom';

function RouterView(props) {
  return (
    <Suspense fallback={<h1>loading...</h1>}>
      <Switch>
        {props.routes.map((item, index) => {
          return (
            <Route
              key={index}
              path={item.path}
              exact={item.exact}
              render={(props) =>
                item.redirect ? (
                  <Redirect push to={item.redirect} from={item.path} />
                ) : (
                  <item.component {...props} routes={item.children} />
                )
              }
            />
          );
        })}
      </Switch>
    </Suspense>
  );
}
export default RouterView;

src/App.jsx

import {BrowserRouter, NavLink} from "react-router-dom"
import RouterView from './router/index';
import routes from './router/routes';

export default () => {
  return (
    <div className='app-route'>
      <BrowserRouter>
        {/* 页面导航 */}
        <ul>
          <li> <NavLink to="/" exact>about</NavLink> </li>
          <li> <NavLink to="/home" exact>home</NavLink> </li>       
        </ul>
        <RouterView routes={routes}  />
      </BrowserRouter>
    </div>
  );
};

src/pages/Home.jsx

import React from 'react';
import { NavLink} from 'react-router-dom';
import RouterView from '../router/index';

export default (props) => {
  return (
    <div>
      <li> <NavLink to='/home/home1'>home11111</NavLink> </li>
      <li> <NavLink to='/home/home2'>home22222</NavLink> </li>
      <RouterView routes={props.routes} />
    </div>
  );
};

src/pages/Home1.jsx

export default (props) => {
  return <div>Home1</div>;
};

src/pages/Home2.jsx

export default (props) => {
  return <div>Home2</div>;
};

src/pages/About.jsx

import React from 'react';
const About = () => {
  return <div> about </div>;
};
export default About;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值