Vue功能菜单的异步加载、动态渲染

实际的Vue应用中,常常需要提供功能菜单,例如:文件下载、用户注册、数据采集、信息查询等等。每个功能菜单项,对应某个.vue组件。下面的代码,提供了一种独特的异步加载、动态渲染功能菜单的构建方法:

javascript 复制代码
<script setup>
import {defineComponent, getCurrentInstance, h} from 'vue'

//定义需要显示的功能菜单项
const menus = [
  {id: 'home', name: '首\u3000页'},
  {id: 'user.login', name: '用户登录'},
  {id: 'user.regist', name: '用户注册'},
  {id: 'college.list', name: '学院风采'},
  {id: 'query.student', name: '学生查询'},
  {id: 'enroll.chart', name: '招生一览'},
  {id: 'upload.docs', name: '资料上传'},
  {id: 'chat.room', name: '畅论空间'}
]
const app = getCurrentInstance().appContext.app                        //当前Vue应用
//异步加载.vue组件并注册
Promise.all( 
    menus.map(({id}) => id === 'home' ?
        {__name: id, setup: null, render: null} : import(`./modules/${id}.vue`))
).then(modules => modules.forEach(m => app.component(m.__name, m)))    //注册组件
const store = app.config.globalProperties.$pinia._s.get('loginer')     //状态管理数据
//动态渲染功能菜单项
const AppMenu = defineComponent({              //定义功能菜单组件
  render() {
    return h('div', {class: 'home-menu'},
                h('ul', {class: 'home-ul'},    //用无序列表构建菜单项
                    menus.map(({id, name}) =>
                        h('li', {              //无序列表的列表项,对应功能菜单项
                          id: id,              //模块id
                          innerText: name,     //菜单名
                          onClick: event => store.setModule(event.target.id) //加载模块
                }))
        ))
  }
})
</script>

<template>
  <app-menu></app-menu>
</template>

上述处理,需要细细琢磨。提示:.vue组件解析、编译后的基本构成要素为:{__name: '组件id', setup: {组合式函数}, render: {渲染函数}}。需要充分认识这一特点,才能更好地理解上述处理方法。

相关推荐
SuperEugene6 分钟前
Vue Router 实战规范:path/name/meta 配置 + 动态 / 嵌套路由,统一团队标准|状态管理与路由规范篇
开发语言·前端·javascript·vue.js·前端框架
小彭努力中24 分钟前
194.Vue3 + OpenLayers 实战:动态位置 + 高度 + 角度,模拟卫星地面覆盖范围
前端·css·vue.js·openlayers·animate
颜正义25 分钟前
作为前端你还不会 Playwright 进行单元测试吗?
前端·测试
孟陬26 分钟前
国外技术周刊 #3:“最差程序员”带动高效团队、不写代码的创业导师如何毁掉创新…
前端·后端·设计模式
张一凡9327 分钟前
easy-model -- "小而美"的React状态管理方案
前端·javascript·react.js
前端Hardy28 分钟前
纯 HTML/CSS/JS 实现的高颜值登录页,还会眨眼睛!少女心爆棚!
前端·javascript·vue.js
includei30 分钟前
【JavaScript】华为机试_HJ20_密码验证合格程序
开发语言·javascript·华为
猪八宅百炼成仙1 小时前
解决Vue项目中scrollIntoView导致的布局异常问题
前端
miss1 小时前
Vue2 → Vue3 深度对比:8 大核心优化,性能提升 2 倍
前端·vue.js·架构
沫离痕1 小时前
AI机器人客服-Dify接入
开发语言·javascript·ecmascript