-
Notifications
You must be signed in to change notification settings - Fork 2.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
支持导航菜单动态配置 #3290
Comments
Will you send the corresponding Project link so I can help you out :) |
涉及到两个点:
|
背景
方案一介绍
使用Layout 配置headertitle: layout 的左上角的 title logo: layout 左上角 logo url
headerMenuConfig顶部菜单栏的配置 asideMenuConfig侧边菜单栏的配置 headerRightRender头部右侧展示的组件 默认展示头像组件
menuMode菜单模式:side: 左侧导航,top: 顶部导航
menuData侧边栏或顶部栏菜单配置,用于异步获取服务端的菜单数据并和静态的菜单数据进行合并。当设置该属性时,不会读取
IMenuConfig 数据结构 interface IMenuConfig {
name: string;
path: string;
icon?: string;
children?: IMenuConfig[]
} menuSettings
menuRender菜单 render 方法
footerRender底部组件 render 方法
settings
// src/BasicLayout/index.jsx
import React from 'react';
import IceLayout from 'ice-layout';
import config from './config';
// 或者直接写组件的 props
export default <IceLayout footerRender={<Footer />} header={ title: 'ICE' } ... />
// export default <IceLayout {...config} />
// src/layouts/BasicLayout/config.js
import React from 'react';
import Footer from './Footer';
export default {
header: {
title: 'ICE',
logo: 'https://ice.work'
},
headerRightRender: (
<>
<Notice />
<HeaderAvatar />
</>
),
settings: {
device: 'phone',
type: 'dark',
},
// navigation(菜单)配置
menuSettings: {
collapse: true
},
headerMenuConfig: [],
asideMenuConfig: [
{
name: '数据页面',
path: '/',
icon: 'chart-pie',
children: [
{
name: '分析页面',
path: '/dashboard/analysis',
},
]
},
],
footerRender: <Footer />
} 菜单栏动态配置获取动态菜单与静态菜单结合,在 // src/layouts/BasicLayout/config.js
import React from 'react';
export default {
menuData: async function() {
// 模拟服务端返回的数据
const data = await request('/api/menu');
const { customMenu } = data;
return [
// 服务器获取的菜单数据
...customMenu.asideMenuConfig,
// 静态的菜单数据
...this.asideMenuConfig
],
}
} 方案二介绍
使用Layout 配置相关的参数配置同上
// src/app.jsx
import React from 'react';
import { createApp } from 'ice';
const appConfig = {
layout: [{
// Layout 名称
name: 'BasicLayout',
header: {
title: 'ICE',
logo: 'https://ice.work'
},
headerRightRender: (initialState) => {
return (
<>
<Notice />
<HeaderAvatar />
</>
)
},
settings: {
device: 'phone',
type: 'dark',
},
// navigation(菜单)配置
menuSettings: {
collapse: true
},
// menu 菜单配置
menuData: () => {
return [
{
name: '数据页面',
path: '/',
icon: 'chart-pie',
children: [
{
name: '分析页面',
path: '/dashboard/analysis',
},
},
]
},
footerRender: () => <Footer />
},
],
}
createApp(appConfig);
import { BasicLayout } from 'ice';
const routerConfig = [
{
path: '/',
component: BasicLayout,
children: [
{ path: '/hello', component: Hello },
],
},
] 菜单栏动态配置
// src/app.jsx
import { createApp } from 'ice';
const appConfig = {
layout: [{
// Layout 名称
name: 'BasicLayout',
// menu 菜单配置
menuData: ({ menu }) => {
return [
{
name: '数据页面',
path: '/',
icon: 'chart-pie',
children: [
{
name: '分析页面',
path: '/dashboard/analysis',
},
},
...menu.asideMenuConfig
]
},
}
],
}
createApp(appConfig); 总结方案一不依赖 icejs,直接用一个组件包来封装 Layout。另外可以新建一个 方案二需要在 icejs 上增加插件,额外在 |
需要下考虑权限的处理方式 |
方案 updated |
|
方案1,目前设计的方案是不可以覆盖常见模板的布局。想法是覆盖大部分的使用场景即可,有定制需求使用原始的 Layout 方案。 |
最终讨论结果是使用第一个方案 |
在某些项目中,需要根据用户场景,重新组织菜单结构,这样对造成产品的多分支,部署也比较麻烦。
另外有时需要在菜单中增加外链,如果采用目前的配置方式也需要修改代码才可以,而且也无法进行权限的配置。
是否能够提供可以配置菜单的功能?菜单在后台配置,用户在登录时获取对应结构菜单结构进行展现。
希望有一个动态的切入点,能够加载外部递送的菜单,并将其与静态菜单结合。这样无论采用静态菜单还是动态菜单,都不用修改ice的源代码了。后续升级也会比较方便。
The text was updated successfully, but these errors were encountered: