vue3
使用antvue3
项目中新增 antd
此处是通过 vue cli 创建 vue3.0 项目,直接在项目目录下新增
1. 安装 ant to vue3
通过
yarn
或者npm
进行安装ant
yarn add ant-design-vue@next
# OR
npm i --save ant-design-vue@next
!!! 如果是需要全局安装不要使用官方的方法来进行一个安装,在21-08-02 使用官方教程安装后使用 vue3.0
方法进行引用会在浏览器内提示 Cannot read property 'use' of undefined
,但是在终端中不会有错误提示, 使用上方方法安装,可正常使用
ant
官方安装方法
npm install ant-design-vue --save
yarn add ant-design-vue
vue3
中,配置 ant
全局配置ant 在vue3中全局挂载模块和vue2中有一点区别, 区别不大
编辑 src
目录下的 main.js
,使用 app.use
来进行导入,支持链式调用
import { createApp } from 'vue';
import Antd from 'ant-design-vue';
import App from './App';
const app = createApp(App);
app.use(Antd);//此处为引用antd
app.mount("#app");
// 也可以按照下面方式进行引用,xxx为模块
createApp(app).use(xxx).use(xxx).use(Antd)
sidebar
侧边栏部分可以使用 ant
的布局 Layout
来实现,配合 ant
的导航菜单 a-menu
子菜单使用 a-sub-menu
来实现多层级
<a-menu>
<a-menu-item>目录1</a-menu_item>
<a-sub-menu title="目录2">
<a-menu-item>子目录1</a-menu-item>
<a-menu-item>子目录2</a-menu-item>
</a-sub-menu>
</a-menu>
如上方代码显示的结构将会显示为
目录2的子目录1 目录2的子目录2
通过递归循环渲染此结构即可实现递归渲染
示例数据结构
[
{
text: '摄像头',// 页面标题
is_menus: true,//是否为侧边栏的大项
children: [
{
is_menu: true,
text: '摄像头列表',
path: '/cameraList',
name: 'Home',
component: Home
},
{
is_menu: true,
text: '录像',
path: '/cameraVideo',
name: 'Home',
component: Home
}
],
},
{
text: '账户',
is_menus: true,
children: [
{
is_menu: true,
text: '配置',
path: '/userConfig',
name: 'Home',
component: Home
}
],
},
{
title: '日志',
is_menu: true,//路由项
path: '/log',
name: 'Log',
text: '日志',
component: Home
}
]
在 sidebarMenuItem.js
中的内容
<template>
<a-menu-item v-if="menu.is_menu" :key="mykey">
<router-link :to="menu.path">{{menu.text}}</router-link>
</a-menu-item>
<a-sub-menu v-if="menu.is_menus" :title="menu.text" :key="mykey">
<sidebar-menu-item v-for="(item,i) in menu.children" :mykey="menu.path +'_'+item.path+'_'+i" :menu="item" :key="menu.path +'_'+item.path+'_'+i" ></sidebar-menu-item>
</a-sub-menu>
</template>
<script>
export default {
name: 'sidebar-menu-item',
components: {
},
props: {
menu: {
type: Object,
default: function (){
return {}
}
},
mykey: {
type: String,
default: ''
}
},
mounted(){
console.log(this.menu);
}
}
</script>
<style>
</style>
在app.js中使用sidebarMenuItem的内容
<template>
<a-layout id="components-layout-demo-responsive" class="h-full">
<a-layout-sider
breakpoint="lg"
collapsed-width="0"
@collapse="onCollapse"
@breakpoint="onBreakpoint"
>
<div class="logo" />
<a-menu mode="inline" >
<!-- 此处为使用组件 menus为数组 -->
<sidebarMenuItem v-for="(item,i) in menus" :menu="item" :mykey="item.path + '_'+i" :key="'menu_'+item.path + '_'+i" />
</a-menu>
</a-layout-sider>
<a-layout class="h-full flex">
<a-layout-content>
<router-view/>
</a-layout-content>
<a-layout-footer style="textAlign: center">
ant
</a-layout-footer>
</a-layout>
</a-layout>
</template>
<script>
import sidebarMenuItem from './components/sidebars/sidebarMenuItem.vue'
export default {
name: 'App',
components: {
sidebarMenuItem,
},
data(){
return {
menus: []
}
},
}
</script>
多看文档,ant文档地址
- 操作一个菜单其他菜单会一起响应. 解决方法: 此时需要给每一个
a-menu-item
以及a-sub-menu
设置key
值 通过给组件设置mykey
属性赋值给key
值- vue2好像就是这么整的
渲染出来的子菜单栏在侧边栏旁边生成 解决方法: 在创建
a-menu
组件时设置属性mod
为inline
<a-menu mode="inline"> 其他组件 </a-menu>