跳到主要内容

嵌套路由

1.gif

XinAdmin 支持页面中嵌套路由,以实现对某些页面中标签页的动态路由加载。如果你需要使用嵌套路由,首先你要有一个页面路由,类似的配置如:


const route = [
{
id: 32,
pid: 30,
type: 'route',
name: '用户设置',
local: "menu.user.setting",
icon: "UserSwitchOutlined",
key: 'user.setting',
path: '/user/setting',
elementPath: '/user/setting/index',
}
]

上面我们定义了一个页面路由,它会生成一个菜单,并且菜单的页面组件为 src/pages/user/setting/index.tsx

当我们在这个页面中希望有多个标签页,并且标签页用路由动态加载:

// src/pages/user/setting/index.tsx

export default () => {
const tabsList = [
{
label: '基本信息',
key: '/user/setting',
},
{
label: '安全设置',
key: '/user/setting/security',
},
{
label: '实名认证',
key: '/user/setting/verification',
},
]


return (
<>
<Tabs
onChange={(key) => {
// 在点击切换标签的时候,跳转到对应的路由
navigate(key)
}}
items={tabsList}
/>
<div> 点击切换标签的时候,这个地方会加载相应的组件,以实现嵌套路由 </div>
</>
)
}

当点击标签的时候,我们不希望切换整个页面,而是切换这个页面中嵌套的一部分组件,下面我们就利用嵌套路由来实现这一点。

首先我们新增两个组件,分别用于显示 基本信息安全设置

// src/pages/user/setting/basic.tsx
export default () => {
return <> 基本信息 </>
}

// src/pages/user/setting/security.tsx
export default () => {
return <> 安全设置 </>
}

然后我们添加这两个组件的规则:

const route = [
{
id: 32,
pid: 30,
type: 'route',
name: '用户设置',
local: "menu.user.setting",
icon: "UserSwitchOutlined",
key: 'user.setting',
path: '/user/setting',
elementPath: '/user/setting/index',
},
{
id: 33,
pid: 32,
type: 'nested-route',
name: '基本信息',
key: 'user.setting.info',
path: '/user/setting',
elementPath: '/user/setting/info',
},
{
id: 34,
pid: 32,
type: 'nested-route',
name: '安全设置',
key: 'user.setting.security',
path: '/user/setting/security',
elementPath: '/user/setting/security',
},
]
注意

嵌套路由必须有默认的显示内容,我们在封装的时候将路由的第一个嵌套路由作为索引路由,来实现默认显示

最后一步,我们将路由组件 <Outlet /> 添加到页面中需要显示的部分

// src/pages/user/setting/index.tsx

export default () => {
const tabsList = [
{
label: '基本信息',
key: '/user/setting',
},
{
label: '安全设置',
key: '/user/setting/security',
}
]


return (
<>
<Tabs
onChange={(key) => {
// 在点击切换标签的时候,跳转到对应的路由
navigate(key)
}}
items={tabsList}
/>
{/*<div> 点击切换标签的时候,这个地方会加载相应的组件,以实现嵌套路由 </div>*/}
<Outlet />
</>
)
}

这样我们就实现了在页面中嵌套路由。