Vue3+Element-Plus 实现点击左侧菜单时显示不同内容组件展示在Main区域功能 二九_小丫头呀的博客-程序员秘密_element点击菜单后出现不同内容

技术标签: elementui  前端  vue.js  Vue3+Element-Plus 前端开发  javascript  

1.本章目标

1.1 点击不同的菜单列表,可以在右侧 (Main) 主体区域显示不同的组件页面

2. 如何实现

2.1 通过将左侧菜单列表改造成路由链接的形式来实现

1. 首先应该为 Menu (菜单)启用 vue-router 模式 (路由模式),默认是false 

Menu 菜单 | Element Plus (gitee.io)icon-default.png?t=LA92https://element-plus.gitee.io/zh-CN/component/menu.html#menu-%E5%B1%9E%E6%80%A7

 2. 在 menu 节点中设置 router属性 为true 开启路由模式

小技巧 

  •  如果需要把某个属性的值重置成true,可以对该属性进行简写。
  • 例如 :router="true" 可以简写成 router
  • :router 前面加冒号,代表属性绑定。必须按照该规则,使用属性时才生效

 3. 左侧菜单路由模式开启后,需要设定各页面的跳转地址

  • 页面的跳转地址由服务器提供,例如。

  •  代码改造,每一个二级菜单,应取服务器返回的path 属性做为跳转的唯一值,而不是Id。

 小技巧

  1. 由于路由都是以 斜线 (/) 开头,所以取到值后,需要在前面追加斜线

2.2  接下来,监听跳转的路由链接,实现点击二级菜单列表时,在Main 区域展示不同的内容组件

1.首先,第一步应创建各菜单列表链接对应的各内容组件页面。例如,创建一个用户组件页面

 2. 监听路由

  • 由于Welcome组件是作为 Home 组件的子路由规则来进行嵌套展示在Main 内容区域的。
  • 所以,左侧菜单的子组件需要展示在 Main 内容区域,那么左侧菜单的子组件(二级菜单)也需要嵌套在Home 组件里面作为Home 组件的 子路由规则进行展示在 Main 区域。

 3. 最终效果

 2.3 各组件代码

1. 路由规则 index.js

import { createRouter, createWebHashHistory } from 'vue-router'
import Login from '../components/Login.vue'
import Home from '../components/Home.vue'
import Welcome from '../components/Welcome.vue'
import Users from '../components/user/Users.vue'
const routes = [
  {
    path: '/',
    redirect: '/login'
  },
  {
    path: '/login',
    component: Login
  },
  {
    path: '/home',
    component: Home,
    redirect: '/welcome',
    children: [
      { path: '/welcome', component: Welcome },
      { path: '/users', component: Users }
    ]
  }
]

const router = createRouter({
  history: createWebHashHistory(),
  routes
})

// 挂载路由导航守卫
router.beforeEach((to, from, next) => {
  if (to.path === '/login') return next()
  // 获取token
  const tokenStr = window.sessionStorage.getItem('token')
  if (!tokenStr) return next('/login')
  next()
})

export default router

2. Home.vue 组件 

<template>
  <el-container class="home_container">
    <!-- 头部区域 -->
    <el-header>
      <div>
        <img src="../assets/heima.png" alt="" />
        <span>电商后台管理系统</span>
      </div>
      <el-button type="info" @click="logout">退出</el-button>
    </el-header>
    <!-- 页面主体区域 -->
    <el-container>
      <!-- 侧边栏 -->
      <el-aside :width="isCollapse ? '64px':'200px'">
        <div class="toggle-button" @click="toggleCollapse">|||</div>
        <!-- 侧边栏菜单区域 -->
        <el-menu active-text-color="#409Eff"
        background-color="#545c64"
        text-color="#fff" unique-opened
        :collapse="isCollapse" :collapse-transition="false"
        :router="true">
        <!-- 一级菜单 -->
        <el-submenu :index="item.id+''" v-for="item in menulist" :key="item.id">
          <!-- 一级菜单模板区域 -->
          <template #title>
            <el-icon :class="iconsObj[item.id]"></el-icon>
            <span>{
   {item.authName}}</span>
          </template>
          <!-- 二级菜单 -->
          <el-menu-item :index="'/'+subItem.path" v-for="subItem in item.children" :key="subItem.id">
          <template #title>
            <el-icon><iconMenu /></el-icon>
            <span>{
   {subItem.authName}}</span>
          </template>
          </el-menu-item>
        </el-submenu>
      </el-menu>
      </el-aside>
      <!-- 右侧内容主体区域 -->
      <el-main>
        <!-- 路由占位符 -->
        <router-view></router-view>
      </el-main>
    </el-container>
  </el-container>
</template>
<script>
export default {
  data () {
    return {
      // 左侧菜单数据对象
      menulist: [],
      // 字体图标对象
      iconsObj: {
        125: 'iconfont icon-users',
        103: 'iconfont icon-tijikongjian',
        101: 'iconfont icon-shangpin',
        102: 'iconfont icon-danju',
        145: 'iconfont icon-baobiao'
      },
      // 是否折叠
      isCollapse: false
    }
  },
  created () {
    this.getMenuList()
  },
  methods: {
    logout () {
      window.sessionStorage.clear()
      this.$router.push('/login')
    },
    // 获取所有的菜单数据
    async  getMenuList () {
      const { data: res } = await this.$http.get('menus')
      if (res.meta.status !== 200) return this.$message.error(res.meta.msg)
      // 成功了,进行赋值
      this.menulist = res.data
      console.log(res)
    },
    // 点击按钮,切换菜单的折叠与展开
    toggleCollapse () {
      this.isCollapse = !this.isCollapse
    }
  }
}
</script>
<style lang="less" scoped>
.home_container {
  height: 100%;
}
.el-header {
  background-color: #363d40;
  // 给头部设置一下弹性布局
  display: flex;
  // 让它贴标左右对齐
  justify-content: space-between;
  // 清空图片左侧padding
  padding-left: 0;
  // 按钮居中
  align-items: center;
  // 文本颜色
  color: #fff;
  // 设置文本字体大小
  font-size: 20px;
  // 嵌套
  > div {
    // 弹性布局
    display: flex;
    // 纵向上居中对齐
    align-items: center;
    // 给文本和图片添加间距,使用类选择器
    span {
      margin-left: 15px;
    }
  }
}
.el-aside {
  background-color: #313743;
  .el-menu {
    border-right: none;
  }
}
.el-main {
  background-color: #e9edf1;
}
.iconfont{
  margin-right: 10px;
}
.toggle-button{
 // 添加背景颜色
 background-color: #4A5064;
 // 设置文本大小
 font-size:10px;
 // 设置文本行高
 line-height:24px;
 // 设置文本颜色
 color:#fff;
 // 设置文本居中
 text-align: center;
 // 设置文本间距
 letter-spacing: 0.2em;
 // 设置鼠标悬浮变小手效果
 cursor:pointer;
}
</style>

3. Users.vue 组件 

<template>
  <div>
    <h3>用户列表组件</h3>
  </div>
</template>

<script>
export default {

}
</script>

<style lang="less" scoped>

</style>

以上出自:

【黑马程序员】前端开发之Vue项目实战_Element-UI【配套源码+笔记】_哔哩哔哩_bilibiliicon-default.png?t=LA92https://www.bilibili.com/video/BV1x64y1S7S7?p=40

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39237340/article/details/121940314

智能推荐

uboot环境变量_Stone_lu。的博客-程序员秘密

首先我们先要搞清楚uboot中环境变量的作用,uboot中环境变量的作用就是在不改变源码、不用重新编译的情况下,可以使我们通过设置环境变量的值来改变uboot的一些设置,如bootdelay时间、机器码的值等等下面我们来具体看一下uboot中环境变量如何实现首先看一下环境变量的初始化函数:env_init函数中实际执行的就是把default_environment的地址赋值给全局变...

java paths_java – 无法使用Paths.get()从Maven资源加载文件_挖数的博客-程序员秘密

我为这个看似简单且几乎是一个愚蠢的问题道歉,但我花了很多时间来修复它而没有太大的成功.我创建了一个非常简单的maven项目,然后在src / resources文件夹中创建了一个简单的文本文件.pom.xml很简单. App类看起来像这样:public class App {public static void main(String[] args) throws IOException {Fil...

Disruptor源码分析(二)RingBuffer_任性之闲来无事的博客-程序员秘密_ringbuffer elementat

RingBuffer,从字面上看,它是一个环形缓冲队列。实际上,它不是一个队列,因为它不具备队列的特性,比如FIFO等。RingBuffer本身是一个数组,之所以说它是环形队列,因为它通过算法维持了一个类似环形队列的数据结构。上图是对RingBuffer的一个抽象描述。假定一个8个槽的RingBuffer,则本质上是一个长度为8的数组,那如何模拟一个环形队列呢?通过序列号(se...

关于UpdateData()函数的使用,参数TURE和FALSE的使用_liquanhai的博客-程序员秘密

当你使用了ClassWizard建立了控件和变量之间的联系后:当你修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用UpdateData(FALSE);如果你希望知道用户在对话框中到底输入了什么,就应该在访问变量前调用UpdateData (TRUE)。 

近世代数-群论基础一[email protected]的博客-程序员秘密

近世代数-群论基础一半群与群半群:在集合,任意x,yx,yx,y经过一元运算x∘yx\circ yx∘y 得到的结果依然是在该集合内的,且满足结合律幺半群:在半群的基础上引入幺元(单位元)定理2.1:括号的添加方式(位置)与结果无关群:每个元素都可逆的幺半群定义:非空集GGG按它的二元运算∘\circ∘,形成群当且仅当GGG对运算∘\circ∘封闭,即a,b∈G⇒a∘b∈Ga,b\in G\Rightarrow a\circ b\in Ga,b∈G⇒a∘b∈G运算∘\circ∘ 满足结合

随便推点

ARM指令集详解_nicholas_duan的博客-程序员秘密_orrs arm

ARM指令集详解1.       汇编1.1.    通用寄存器 通用寄存器37个寄存器,31个通用寄存器,6个状态寄存器,R13堆栈指针sp,R14返回指针,R15为PC指针, cpsr_c代表的是这32位中的低8位,也就是控制位CPSR有4个8位区域:标志域(F)、状态域(S)、扩展域(X)、控制域(C)MSR - Load specified fields of...

MyCat 基础 - 安装与介绍_全栈-民的博客-程序员秘密

前言在使用MyCat的时候,我们来聊一下为什么使用这个东西吧。有详细的中间件对比,点击这里 MySQL 学习 - 不同场景下技术抉择官网地址:http://www.mycat.io/数据库中间件产品对于目前来说 MyCat依旧是我们不二的选择产品收费情况是否开源普及率功能MyCat免费开源高分片算法丰富、读写分离、全局主键、分布式事务Atlas...

FusionCharts使x轴值倾斜或竖直显示_Eclipse_80的博客-程序员秘密

在chart标签中加入 labelDisplay='ROTATE' 即可使x轴竖直显示,在加入 slantLabels='1'会倾斜显示。

渗透测试实验_在kali Linux 2021环境下使用sqlmap对DVWA进行sql注入_Outlook(^_^)的博客-程序员秘密_kali linux sql注入测试工具

文章目录1. sqlmap是什么2. 启动kali Linux ,进行sqlmap更新3. 启动phpStudy,启动火狐浏览器代理,运行BurpSuite4. 如果sqlmap出现404或者返回test的报错,可以尝试重置DVWA,重启phpStudy5. 选择安全等级“Low”,点击“SQL Injection”,通过报文中的url和cookie构造sqlmap命令获取信息5.1 获取数据库5.2 获取dvwa数据库中的表名5.3 获取dvwa库中users表中的列名5.4 获取dvwa库中users表_1671465600

常用oracle之常用函数_筷子程序猿乐子的博客-程序员秘密_oracle 面试常用函数

select round(10.38764, 3) round from dual;     --四舍五入。10.388  select trunc(10.38764, 3) trunc from dual;       --截断。10.387  select to_char(sysdate, 'yyyy-MM-dd hh24:mi:ss') to_char from dual;    -

navicat 连接sqlserver报错及解决方法_小蚂蚁hjk的博客-程序员秘密_navicat连接sqlserver报错

navicat premium 链接sqlserver[IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序安装navicat自带sqlncli_x64.msi,就在安装目录下,安装后问题解决!

推荐文章

热门文章

相关标签