第2天

983 阅读2分钟

一. vue3使用element-Plus

有三种引入方法

第一种 完整引入:

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

main.js:

import { createApp } from 'vue'
import App from './App.vue'
import "../src/assets/less/index.less"
import router from "./router"
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

const app = createApp(App)
app.use(router).mount('#app')
app.use(ElementPlus)

App.vue:

<template>
  <div>
    <router-view></router-view>
    <el-button>Default</el-button>
    <el-button type="success">Success</el-button>
  </div>
</template>

<script>
export default {

}
</script>

<style> 
#app{
  width:100%;
  height:100%;
  overflow: hidden;
}
</style>

第二种: 自动导入

npm install -D unplugin-vue-components unplugin-auto-import

vite.config:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
// https://vite.dev/config/
export default defineConfig({
  plugins: [vue(), AutoImport({
    resolvers: [ElementPlusResolver()],
  }),
  Components({
    resolvers: [ElementPlusResolver()],
  })
  ],
})

这里我使用的是第一种完整引入

二. 引入图标

mian.js中加入

import * as ElementPlusIconsVue from '@element-plus/icons-vue'

for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component)
}

三. 简单实现Main组件

Main.vue:

<template>
  <div class="common-layout">
    <el-container class="lay-container">
     <!-- 左侧 -->
      <common-aside> 
      </common-aside>
      <!-- 右侧 -->
      <el-container>
         <el-header class="el-header">
          <common-header></common-header>
         </el-header>
         <el-main class="right-main">
          main
         </el-main>
      </el-container>

    </el-container>
  </div>
</template>

<script>
export default {

}
</script>

<style lang="less" scoped>
 .common-layout,.lay-container{
  height: 100%;
 }
 .el-header{
  background-color: #333;
 }
</style>

实现效果:

image.png

四.左侧菜单栏

(这里写了好久,因为没写CommonAside的引入,还有菜单栏的v-for没弄懂)

main.js中加入:

<script>
import { defineAsyncComponent } from 'vue';
export default{
  components:{
    'common-aside':defineAsyncComponent(()=>import('../components/CommonAside.vue'))
  }
}
</script>

CommonAside.vue:

<template>
  <el-aside width="180px">
    <el-menu background-color="#545c64" text-color="#fff">
      <h3>管理平台</h3>

      <el-menu-item
       v-for="item in noChildren" 
      :index="item.path"
      :key="item.path">
        
        <component class="icons" :is="item.icon"></component>
        <span>{{ item.label }}</span>
        </el-menu-item>

        <!-- //有子菜单的 -->
        <el-sub-menu 
        v-for="item in hasChildren" 
        :index="item.path"
        :key="item.path"
        >
          <template #title>
            <component class="icons" :is="item.icon"></component>
            <span>{{ item.label }}</span>
          </template>
          <el-menu-item-group >
            <el-menu-item
            v-for="subItem in item.children" 
            :index="subItem.path"
            :key="subItem.path"
            >
            <component class="icons" :is="subItem.icon"></component>
            <span>{{ subItem.label }}</span>
           </el-menu-item>
            
          </el-menu-item-group>
          
          
        </el-sub-menu>

        
        
      </el-menu>
  </el-aside>
</template>

<script setup>
import {ref,computed} from 'vue'
const list =ref([
      	{
          path: '/home',
          name: 'home',
          label: '首页',
          icon: 'house',
          url: 'Home'
      	},
        {
            path: '/mall',
            name: 'mall',
            label: '商品管理',
            icon: 'video-play',
            url: 'Mall'
        },
        {
            path: '/user',
            name: 'user',
            label: '用户管理',
            icon: 'user',
            url: 'User'
        },
        {
            path: 'other',
            label: '其他',
            icon: 'location',
            children: [
                {
                    path: '/page1',
                    name: 'page1',
                    label: '页面1',
                    icon: 'setting',
                    url: 'Page1'
                },
                {
                    path: '/page2',
                    name: 'page2',
                    label: '页面2',
                    icon: 'setting',
                    url: 'Page2'
                }
            ]
        }
])

const noChildren=computed(()=>list.value.filter(item=>!item.children))
const hasChildren=computed(()=>list.value.filter(item=>item.children))


</script>

<style lang="less" scoped>

.icons {
  width:18px;
  height:18px;

}
.el-menu{
  border-right:none;
  h3 {
    line-height: 48px;
    color: #fff;
    text-align: center;
    }
}
.el-aside{
   height:100%;
   background-color: #545c64;
}

</style>

五.Header部分

CommonHeader.vue: 增加了面包屑,头像下拉菜单

<template>
  <div class="header">
      <div class="l-content">
        <el-button size="small">
           <component class="icons" :is="menu"></component>
        </el-button>
        <el-breadcrumb separator="/" class="bread">
            <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
        </el-breadcrumb>
      </div>

      <div class="r-content">
        <el-dropdown>
            <span class="el-dropdown-link">
                <img :src="getImageUrl(user)" class="user"/>
            </span>
            <template #dropdown>
            <el-dropdown-menu>
                <el-dropdown-item>个人中心</el-dropdown-item>
                <el-dropdown-item>退出</el-dropdown-item>
                
            </el-dropdown-menu>
            </template>
        </el-dropdown>
      </div>

  </div>
</template>

<script>
import { ref, computed } from 'vue'

export default {
  setup() {
    const user = ref('defaultUser') // 定义 user 变量
    const getImageUrl = (user) => {
      return new URL(`../assets/images/${user}.png`, import.meta.url).href
    }

    return {
      user,
      getImageUrl
    }
  }
}
</script>

<style>
 .header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    width: 100%;
    height: 100%;
    background-color: #333;
 }
 .icons {
     width: 20px;
     height: 20px;

 }
 .l-content {
    display: flex;
    align-items: center;
    
 }
 .el-button {
        margin-right: 20px;
    }

     .user {
        width: 40px;
        height: 40px;
        border-radius: 50% ;

     }
:deep(.bread span){
    color: #fff !important;
    cursor: pointer !important;
}
.el-breadcrumb-item {
    cursor: pointer !important;
}
</style>

页面显示结果:

image.png