You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spring-boot-online-exam/frontend/src/components/Menu/menu.js

123 lines
2.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 导入Ant Design Vue的Menu和Icon组件
import Menu from 'ant-design-vue/es/menu';
import Icon from 'ant-design-vue/es/icon';
// 从Menu组件中解构出Item和SubMenu
const { Item, SubMenu } = Menu;
// 默认导出Menu组件
export default {
// 组件名称
name: 'SMenu',
// 定义接收的props包括menu菜单项数组theme主题mode模式collapsed折叠状态
props: {
menu: {
type: Array,
required: true
},
theme: {
type: String,
required: false,
default: 'dark'
},
mode: {
type: String,
required: false,
default: 'inline'
},
collapsed: {
type: Boolean,
required: false,
default: false
}
},
// data函数返回组件的初始状态
data () {
return {
openKeys: [], // 展开的菜单项的key数组
selectedKeys: [], // 选中的菜单项的key数组
cachedOpenKeys: [] // 缓存的展开项的key数组
}
},
// 计算属性返回menu的根路径数组
computed: {
SubmenuKeys: vm => {
const keys = [];
vm.menu.forEach(item => keys.push(item.path));
return keys;
}
},
// mounted生命周期钩子组件挂载后调用updateMenu方法
mounted () {
this.updateMenu();
},
// 监听器监听collapsed变化路由变化以及处理菜单项改变
watch: {
collapsed (val) {
if (val) {
this.cachedOpenKeys = this.openKeys.concat();
this.openKeys = [];
} else {
this.openKeys = this.cachedOpenKeys;
}
},
$route: function () {
this.updateMenu();
}
},
// 定义methods包括处理菜单项改变更新菜单渲染菜单项和子菜单项
methods: {
// 处理菜单项改变
onOpenChange (openKeys) {
// ...
},
updateMenu () {
const routes = this.$route.matched.concat();
// ...
},
renderItem (menu) {
// 渲染菜单项
// ...
},
renderMenuItem (menu) {
// 渲染菜单项组件
// ...
},
renderSubMenu (menu) {
// 渲染子菜单组件
// ...
},
renderIcon (icon) {
// 渲染图标组件
// ...
}
},
// 定义render函数返回组件的最终渲染结果
render () {
const { mode, theme, menu } = this;
const props = {
mode: mode,
theme: theme,
openKeys: this.openKeys
};
const on = {
select: obj => {
this.selectedKeys = obj.selectedKeys;
this.$emit('select', obj);
},
openChange: this.onOpenChange
};
const menuTree = menu.map(item => {
if (item.hidden) {
return null;
}
return this.renderItem(item);
});
// 使用Menu组件渲染最终的菜单结构
return (
<Menu vModel={this.selectedKeys} {...{ props, on: on }}>
{menuTree}
</Menu>
);
}
}