Browse Source

优化路由实现

master
1549469775 4 years ago
parent
commit
10d451ff21
  1. 20
      src/AppRouter.tsx
  2. 36
      src/route.tsx

20
src/AppRouter.tsx

@ -6,20 +6,18 @@ import { pageList } from "@/plugins/pageHoc"
import Layout from "@/views/Layout" import Layout from "@/views/Layout"
import Auth from "@/ui/Auth" import Auth from "@/ui/Auth"
import routes,{Loading} from "./route" import routes from "./route"
function Wrapper(props: any) { function Wrapper(props: any) {
if (!props.isSub) { if (props.loading) {
return <React.Suspense fallback={<Loading></Loading>}>{props.children}</React.Suspense> return <React.Suspense fallback={<props.loading></props.loading>}>{props.children}</React.Suspense>
} }
return <Fragment>{props.children}</Fragment> return <Fragment>{props.children}</Fragment>
} }
function RouteMap(props: any) { function RouteMap(props: any) {
const routes: any[] = props.routes const routes: any[] = props.routes
const isSub: boolean = props.isSub
return ( return (
<Wrapper isSub={isSub}>
<Switch> <Switch>
{routes.map((route, index) => { {routes.map((route, index) => {
const { exact = false } = route const { exact = false } = route
@ -33,13 +31,16 @@ function RouteMap(props: any) {
if (route.component) { if (route.component) {
return ( return (
<Auth key={index} needAuth={!!route.meta?.auth} path={route.path} exact={exact}> <Auth key={index} needAuth={!!route.meta?.auth} path={route.path} exact={exact}>
<route.component meta={route.meta}>{route.children && <RouteMap routes={route.children} isSub></RouteMap>}</route.component> <Wrapper loading={route.loading}>
<route.component meta={route.meta}>
{route.children && <RouteMap routes={route.children}></RouteMap>}
</route.component>
</Wrapper>
</Auth> </Auth>
) )
} }
})} })}
</Switch> </Switch>
</Wrapper>
) )
} }
@ -48,11 +49,12 @@ export default function () {
return ( return (
<Router> <Router>
<Layout <RouteMap routes={routes}></RouteMap>
{/* <Layout
render={() => { render={() => {
return <RouteMap routes={routes}></RouteMap> return <RouteMap routes={routes}></RouteMap>
}} }}
></Layout> ></Layout> */}
</Router> </Router>
) )
} }

36
src/route.tsx

@ -1,34 +1,54 @@
import Home from "@/views/Home"
import About from "@/views/About"
import Page404 from "@/views/Auth/Page404" import Page404 from "@/views/Auth/Page404"
import React, {lazy} from "react" import React, { lazy } from "react"
function Test() { function Test() {
return <div>TExtas</div> return <div>TExtas</div>
} }
export const Loading = ()=><div>Loding...</div> const Loading = (props: any) => <div style={{ color: props.color }}>Lodeing.22..</div>
let delay =
(Comp: any, duration = 1000) =>
() =>
new Promise<any>(resolve =>
Comp()
.then((res: any) => {
setTimeout(() => {
resolve(res)
}, duration)
})
.catch(() => {
resolve({
default: () => <div>Error</div>,
})
})
)
export default [ export default [
{ {
path: "/about", path: "/about",
component: About, component: lazy(() => import("@/views/About")),
exact: false,
meta: { meta: {
auth: false, auth: false,
}, },
loading: () => <Loading color="red"></Loading>,
children: [ children: [
{ {
path: "/about/test", path: "/about/test",
exact: true,
meta: { meta: {
auth: false, auth: false,
}, },
component: lazy(()=>import("@/views/Login/Test")), loading: () => <Loading color="green"></Loading>,
component: lazy(delay(() => import("@/views/Login/Test"))),
}, },
], ],
}, },
{ {
path: "/home", path: "/home",
component: Home, component: lazy(() => import("@/views/Home")),
loading: () => <Loading color="blue"></Loading>,
meta: { meta: {
auth: false, auth: false,
}, },
@ -41,7 +61,7 @@ export default [
}, },
{ {
path: "/login", path: "/login",
component: lazy(() => import("@/views/Login")) component: lazy(() => import("@/views/Login")),
}, },
{ {
path: "*", path: "*",

Loading…
Cancel
Save