javascript - 从 React 模板制作嵌套路由时难以使用 useRouteMatch
问题描述
所以我在玩一个名为 CORE UI 的 React UI 模板。我已经定制了侧导航,链接将我引导到我的自定义页面。我遇到的问题是弄清楚如何匹配URL 以使我的嵌套路由动态化。
据我了解,路由是在“routes.js”组件的 JS 对象中建立的,如下所示(不要介意重复性):
import React from 'react';
const Mortgage = React.lazy(() => import('./views/initial/mortgage/Mortgage'));
const Opening = React.lazy(() => import('./views/initial/opening/Opening'));
const Property = React.lazy(() => import('./views/initial/property/Property'));
const Purchasers = React.lazy(() => import('./views/initial/purchasers/Purchasers'));
const Summary = React.lazy(() => import('./views/initial/summary/Summary'));
const Vendors = React.lazy(() => import('./views/initial/vendors/Vendors'));
const Teranet = React.lazy(() => import('./views/initial/teranet/Teranet'));
const Compliance = React.lazy(() => import('./views/initial/compliance/Compliance'));
const Res2req = React.lazy(() => import('./views/closing/res2req/Res2req'));
const Tasks = React.lazy(() => import('./views/closing/tasks/Tasks'));
const Undertakings = React.lazy(() => import('./views/closing/undertakings/Undertakings'));
const Fire = React.lazy(() => import('./views/closing/fire/Fire'));
const Title = React.lazy(() => import('./views/closing/title/Title'));
const Consideration = React.lazy(() => import('./views/closing/consideration/Consideration'));
const Account = React.lazy(() => import('./views/closing/account/Account'));
const Adjustments = React.lazy(() => import('./views/closing/adjustments/Adjustments'));
const Ledger = React.lazy(() => import('./views/closing/ledger/Ledger'));
const Affidavits = React.lazy(() => import('./views/closing/affidavits/Affidavits'));
const Report = React.lazy(() => import('./views/closing/report/Report'));
const ProDocs = React.lazy(() => import('./views/documents/proDocs/ProDocs'));
const FoldDocs = React.lazy(() => import('./views/documents/foldDocs/FoldDocs'));
const Forms = React.lazy(() => import('./views/documents/forms/Forms'));
const Memos = React.lazy(() => import('./views/others/memos/Memos'));
const routes = [
{ path: '/:id/purchase', exact: true, name: 'Home' },
{ path: '/initial', name: 'Initial', component: Summary, exact: true },
{ path: '/initial/summary', name: 'Summary', component: Summary },
{ path: '/initial/opening', name: 'File Opening', component: Opening },
{ path: '/initial/vendors', name: "Vendor's Party", component: Vendors },
{ path: '/initial/purchasers', name: "Purchaser's Party", component: Purchasers },
{ path: '/initial/property', name: 'Property', component: Property },
{ path: '/initial/teranet', name: 'Teranet', component: Teranet },
{ path: '/initial/mortgage', name: 'Mortgage', component: Mortgage },
{ path: '/initial/compliance', name: 'Compliance Letters', component: Compliance },
{ path: '/closing', name: 'Closing', component: Res2req, exact: true },
{ path: '/closing/res2req', name: 'Response to Requisitions', component: Res2req },
{ path: '/closing/undertakings', name: 'Undertakings Received', component: Undertakings },
{ path: '/closing/tasks', name: 'Supplemental Tasks', component: Tasks },
{ path: '/closing/fire', name: 'Fire Insurance', component: Fire },
{ path: '/closing/title', name: 'Title Insurance', component: Title },
{ path: '/closing/consideration', name: 'Consideration', component: Consideration },
{ path: '/closing/adjustments', name: 'Statement of Adjustments', component: Adjustments },
{ path: '/closing/account', name: 'Statement of Account', component: Account },
{ path: '/closing/ledger', name: 'Trust Ledger', component: Ledger },
{ path: '/closing/affidavits', name: 'Executions Affidavits', component: Affidavits },
{ path: '/closing/report', name: 'Report to Purchaser', component: Report },
{ path: '/docs', name: 'Documents', component: ProDocs, exact: true },
{ path: '/docs/proDocs', name: 'Document Production', component: ProDocs},
{ path: '/docs/foldDocs', name: 'Document folder', component: FoldDocs },
{ path: '/docs/forms', name: 'Forms List', component: Forms },
{ path: '/memo', name: 'Memo', component: Memos },
];
export default routes;
由于下面的“TheContent.js”文件,这些对象能够形成路由并渲染相应的组件:
import React, { Suspense } from 'react'
import {
Route,
Switch
} from 'react-router-dom'
import { CContainer, CFade } from '@coreui/react'
// routes config
import routes from '../routes'
const loading = (
<div className="pt-3 text-center">
<div className="sk-spinner sk-spinner-pulse"></div>
</div>
)
const TheContent = () => {
return (
<main className="c-main">
<CContainer fluid>
<Suspense fallback={loading}>
<Switch>
{routes.map((route, idx) => {
return route.component && (
<Route
key={idx}
path={route.path}
exact={route.exact}
name={route.name}
render={props => (
<CFade>
<route.component {...props} />
</CFade>
)} />
)
})}
</Switch>
</Suspense>
</CContainer>
</main>
)
}
export default React.memo(TheContent)
正是这段代码使来自“routes.js”中 JS 对象的 {key:value} 对能够实际路由应用程序:
<Switch>
{routes.map((route, idx) => {
return route.component && (
<Route
key={idx}
path={route.path}
exact={route.exact}
name={route.name}
render={props => (
<CFade>
<route.component {...props} />
</CFade>
)} />
)
})}
</Switch>
所以我的问题是,如何从“routes.js”中的路由中创建动态路由,类似于使用 {useRouteMatch}。不幸的是,当我尝试在对象内部使用该函数时收到错误消息。也许解决方案在于“TheContent.js”中的一小段代码。
如果有任何机构可以提供帮助,那就太棒了。如果您需要我提供更多信息,请告诉我。
解决方案
推荐阅读
- c# - 如何使用 json Ajax 将文件和一些输入字符串发送到 Codebehind 中的 webmethod?
- jquery - 如何对 jQuery AJAX 请求的不同部分进行计时?
- google-bigquery - 将数据加载到 BigQuery 中并根据时间对数据进行分区以及按另一个变量拆分
- spring - Spring boot 提供的“spring.datasource.password”可以更改为“spring.ds.pwd”,而无需为 DataSource 创建新 bean
- java - 如何在java中以递归fn返回
- c# - 层次类 Linq 搜索
- .net - 用 'equals' 和 'comma' 分隔分隔符 .NET Visual Basic
- android - FFmpeg:如何在音频文件中创建动态音量变化?
- node.js - Restify 服务器内容长度不匹配
- python - 打开 csv 文件而不自动分离内容