Vue Web开发(二)

news2025/1/10 16:19:47

1. 项目搭建

1.1. 首页架子搭建

  使用Element ui中的Container布局容器,选择倒数第二个样式,将代码复制到Home.vue。
在这里插入图片描述

1.1.1.下载less

  (1)下载less样式
npm i less
在这里插入图片描述
  (2)下载less编辑解析器
npm i less-loader@5.0.0
在这里插入图片描述
  在项目package.文件中可以看到下载包
在这里插入图片描述

1.1.2. 界面开发

  界面
在这里插入图片描述
(1)按需引入组件

//main.js
import Vue from 'vue'
import App from './App.vue'
import 'element-ui/lib/theme-chalk/index.css';
//ElementUI全局引入
// import ElementUI from 'element-ui';
// Vue.use(ElementUI)
//ElementUI按需引入
import {Button,Container,Aside,Header,Main} from 'element-ui';
Vue.use(Button)
Vue.use(Container)
Vue.use(Aside)
Vue.use(Header)
Vue.use(Main)
import router from '../router/router.js';
Vue.config.productionTip = false
new Vue({
	router,
    render: h => h(App),
}).$mount('#app')

在这里插入图片描述
(2)界面搭建

//view/home.vue
<template>
	<el-container style="height: 100%;">
		<el-aside width="auto">Aside</el-aside>
		<el-container>
			<el-header>Header</el-header>
			<el-main>Main</el-main>
		</el-container>
	</el-container>
</template>
<script>
	export default {
		name: 'Home',
		data() {
			return {}
		}
	}
</script>
<style lang="less">
	.el-header {
		background-color: black;
	}
	.el-main {
		padding-top: 0px;
	}
</style>

在这里插入图片描述

1.2. 左侧导航栏实现

  本质上这个模块应该是在Home.vue的Aside标签内,这个模块每个页面都会用到,所以我们把它新建成一个公共模块,所以我们在components文件下新建CommonAside.vue文件,components会存放所有组件。
  左侧导航栏逻辑如图所示,有一级菜单、二级菜单。这里我们使用Element ui的NavMenu导航菜单组件的折叠组件。
在这里插入图片描述
在这里插入图片描述
  (1)新建components/CommonAside.vue文件,引入现成组件,复制代码至CommonAside.vue文件,还有style、script代码。

//components/CommonAside.vue
<template>
<el-menu default-active="1-4-1" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose" :collapse="isCollapse">
  <el-submenu index="1">
    <template slot="title">
      <i class="el-icon-location"></i>
      <span slot="title">导航一</span>
    </template>
    <el-menu-item-group>
      <span slot="title">分组一</span>
      <el-menu-item index="1-1">选项1</el-menu-item>
      <el-menu-item index="1-2">选项2</el-menu-item>
    </el-menu-item-group>
    <el-menu-item-group title="分组2">
      <el-menu-item index="1-3">选项3</el-menu-item>
    </el-menu-item-group>
    <el-submenu index="1-4">
      <span slot="title">选项4</span>
      <el-menu-item index="1-4-1">选项1</el-menu-item>
    </el-submenu>
  </el-submenu>
  <el-menu-item index="2">
    <i class="el-icon-menu"></i>
    <span slot="title">导航二</span>
  </el-menu-item>
  <el-menu-item index="3" disabled>
    <i class="el-icon-document"></i>
    <span slot="title">导航三</span>
  </el-menu-item>
  <el-menu-item index="4">
    <i class="el-icon-setting"></i>
    <span slot="title">导航四</span>
  </el-menu-item>
</el-menu>
</template>
<script>
	export default {
	  data() {
	    return {
	      isCollapse: true
	    };
	  },
	  methods: {
	    handleOpen(key, keyPath) {
	      console.log(key, keyPath);
	    },
	    handleClose(key, keyPath) {
	      console.log(key, keyPath);
	    }
	  }
	}
</script>
<style>
	.el-menu-vertical-demo:not(.el-menu--collapse) {
	  width: 200px;
	  min-height: 400px;
	}
</style>

在这里插入图片描述
在这里插入图片描述
  (2)在CommonAside.vue文件中新建template标签,将元素标签放入,style、script代码在template标签外面。根据外面的逻辑图删除一些不必要的元素。

//components/CommonAside.vue
<template>
    <el-menu default-active="1-4-1" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose"
             :collapse="isCollapse">
        <el-menu-item index="2">
            <i class="el-icon-menu"></i>
            <span slot="title">导航二</span>
        </el-menu-item>
        <el-submenu index="1">
            <template slot="title">
                <i class="el-icon-location"></i>
                <span slot="title">导航一</span>
            </template>
            <el-menu-item-group>
                <span slot="title">分组一</span>
                <el-menu-item index="1-1">选项1</el-menu-item>
            </el-menu-item-group>
        </el-submenu>
        <el-menu-item index="3" disabled>
            <i class="el-icon-document"></i>
            <span slot="title">导航三</span>
        </el-menu-item>
    </el-menu>
</template>

<script>
    export default {
        data() {
            return {
                isCollapse: false
            };
        },
        methods: {
            handleOpen(key, keyPath) {
                console.log(key, keyPath);
            },
            handleClose(key, keyPath) {
                console.log(key, keyPath);
            }
        }
    }
</script>
<style>
    .el-menu-vertical-demo:not(.el-menu--collapse) {
        width: 200px;
        min-height: 400px;
    }
</style>

在这里插入图片描述
  (3)menu数据:在data()return中定义menu,将数据放入menu,并且将isCollapse属性设置为false!!!,表示图标展开。

[
        {
          path: "/",
          name: "home",
          label: "首页",
          icon: "s-home",
          url: "Home/Home",
        },
        {
          path: "/mail",
          name: "mail",
          label: "商品管理",
          icon: "video-play",
          url: "MailManage/MailManage",
        },
        {
          path: "/user",
          name: "user",
          label: "用户管理",
          icon: "user",
          url: "UserManage/UserManage",
        },
        {
          label: "其他",
          icon: "location",
          children: [
            {
              path: "/page1",
              name: "page1",
              label: "页面1",
              icon: "setting",
              url: "Other/PageOne",
            },
            {
              path: "/page2",
              name: "page2",
              label: "页面2",
              icon: "setting",
              url: "Other/PageTwo",
            }
          ],
        },
      ]
//components/CommonAside.vue
<template>
	<el-menu default-active="1-4-1" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose"
		:collapse="isCollapse">
		<el-menu-item index="2">
			<i class="el-icon-menu"></i>
			<span slot="title">导航二</span>
		</el-menu-item>
		<el-submenu index="1">
			<template slot="title">
				<i class="el-icon-location"></i>
				<span slot="title">导航一</span>
			</template>
			<el-menu-item-group>
				<span slot="title">分组一</span>
				<el-menu-item index="1-1">选项1</el-menu-item>
			</el-menu-item-group>
		</el-submenu>
		<el-menu-item index="3" disabled>
			<i class="el-icon-document"></i>
			<span slot="title">导航三</span>
		</el-menu-item>
	</el-menu>
</template>

<script>
	export default {
		data() {
			return {
				isCollapse: false,
				menu: [{
						path: "/",
						name: "home",
						label: "首页",
						icon: "s-home",
						url: "Home/Home",
					},
					{
						path: "/mail",
						name: "mail",
						label: "商品管理",
						icon: "video-play",
						url: "MailManage/MailManage",
					},
					{
						path: "/user",
						name: "user",
						label: "用户管理",
						icon: "user",
						url: "UserManage/UserManage",
					},
					{
						label: "其他",
						icon: "location",
						children: [{
								path: "/page1",
								name: "page1",
								label: "页面1",
								icon: "setting",
								url: "Other/PageOne",
							},
							{
								path: "/page2",
								name: "page2",
								label: "页面2",
								icon: "setting",
								url: "Other/PageTwo",
							}
						],
					},
				]
			};
		},
		methods: {
			handleOpen(key, keyPath) {
				console.log(key, keyPath);
			},
			handleClose(key, keyPath) {
				console.log(key, keyPath);
			}
		}
	}
</script>

<style>
	.el-menu-vertical-demo:not(.el-menu--collapse) {
		width: 200px;
		min-height: 400px;
	}
</style>

  在CommonAside.vue中,这里主要是处理数据,使用computed计算属性,两个属性,noChildren和hasChildren,需要对数据源进行过滤。过滤使用filter方法,filter里面有一个函数,判断是否有子项目,这样可以拿到noChildren和hasChildren两个数组。主要是为了区分一二级菜单的渲染。

//计算属性
computed:{
      noChildren(){
          return this.menu.filter(item => !item.children)
      },
      hasChildren(){
          return this.menu.filter(item => item.children)
      }
  }

1.2.1. 一级菜单渲染

  一级菜单,进行页面渲染,更改前面的代码。遍历有v-for,使用遍历需要加上key,使用路径作为唯一标识。图标原本是,这里我们用字符串拼接,因为数据中有icon对象,双花括号渲染数据,数据有多少条就渲染多少条,一级菜单一个有四个,分别是首页、商品管理、用户管其他。

<!-- 一级菜单,:=v-bind: -->
    <el-menu-item v-for="item in noChildren" :index="item.path" :key="item.path">
      <i :class="'el-icon-'+item.icon"></i>
      <span slot="title">{{item.label}}</span>
    </el-menu-item>
//components/CommonAside.vue
<template>
	<el-menu default-active="1-4-1" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose"
		:collapse="isCollapse">
		<!-- 一级菜单,:=v-bind: -->
		<el-menu-item v-for="item in noChildren" :index="item.path" :key="item.path">
			<i :class="'el-icon-'+item.icon"></i>
			<span slot="title">{{item.label}}</span>
		</el-menu-item>
		<el-submenu index="1">
			<template slot="title">
				<i class="el-icon-location"></i>
				<span slot="title">导航一</span>
			</template>
			<el-menu-item-group>
				<span slot="title">分组一</span>
				<el-menu-item index="1-1">选项1</el-menu-item>
			</el-menu-item-group>
		</el-submenu>
		<el-menu-item index="3" disabled>
			<i class="el-icon-document"></i>
			<span slot="title">导航三</span>
		</el-menu-item>
	</el-menu>
</template>

<script>
	export default {
		data() {
			return {
				isCollapse: false,
				menu: [{
						path: "/",
						name: "home",
						label: "首页",
						icon: "s-home",
						url: "Home/Home",
					},
					{
						path: "/mail",
						name: "mail",
						label: "商品管理",
						icon: "video-play",
						url: "MailManage/MailManage",
					},
					{
						path: "/user",
						name: "user",
						label: "用户管理",
						icon: "user",
						url: "UserManage/UserManage",
					},
					{
						label: "其他",
						icon: "location",
						children: [{
								path: "/page1",
								name: "page1",
								label: "页面1",
								icon: "setting",
								url: "Other/PageOne",
							},
							{
								path: "/page2",
								name: "page2",
								label: "页面2",
								icon: "setting",
								url: "Other/PageTwo",
							}
						],
					},
				]
			};
		},
		methods: {
			handleOpen(key, keyPath) {
				console.log(key, keyPath);
			},
			handleClose(key, keyPath) {
				console.log(key, keyPath);
			}
		},
		//计算属性
		computed: {
			//没有子菜单
			noChildren() {
				return this.menu.filter(item => !item.children)
			},
			//有子菜单
			hasChildren() {
				return this.menu.filter(item => item.children)
			}
		}
	}
</script>
<style>
	.el-menu-vertical-demo:not(.el-menu--collapse) {
		width: 200px;
		min-height: 400px;
	}
</style>

在这里插入图片描述

1.2.2. 二级菜单渲染

   更改CommonAside.vue文件,item可以拿到数据。
   添加

通用后台管理系统

标签

<!-- 二级菜单 -->
    <el-submenu v-for="item in hasChildren" :index="item.path" :key="item.path">
      <template slot="title">
        <i :class="'el-icon'+item.icon"></i>
        <span slot="title">{{item.label}}</span>
      </template>
      <!-- 这里subItem和subIndex并没有实际意义,只是用来指代item.children的多个数组,两者甚至可以互换,只新定义一个也可以的,:index后面有没有.path都可以运行成功 -->
      <el-menu-item-group v-for="(subItem,subIndex) in item.children" :key="subItem.path">
        <el-menu-item :index="subIndex.path">{{subItem.label}}</el-menu-item>
      </el-menu-item-group>
    </el-submenu>
//components/CommonAside.vue
<template>
	<el-menu default-active="1-4-1" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose"
		:collapse="isCollapse">
		<h3>通用后台管理系统</h3>
		<!-- 一级菜单,:=v-bind: -->
		<el-menu-item v-for="item in noChildren" :index="item.path" :key="item.path">
			<i :class="'el-icon-'+item.icon"></i>
			<span slot="title">{{item.label}}</span>
		</el-menu-item>
		<!-- 二级菜单 -->
		<el-submenu v-for="item in hasChildren" :index="item.path" :key="item.path">
			<template slot="title">
				<i :class="'el-icon'+item.icon"></i>
				<span slot="title">{{item.label}}</span>
			</template>
			<!-- 这里subItem和subIndex并没有实际意义,只是用来指代item.children的多个数组,两者甚至可以互换,只新定义一个也可以的,:index后面有没有.path都可以运行成功 -->
			<el-menu-item-group v-for="(subItem,subIndex) in item.children" :key="subItem.path">
				<el-menu-item :index="subIndex.path">{{subItem.label}}</el-menu-item>
			</el-menu-item-group>
		</el-submenu>
		<el-menu-item index="3" disabled>
			<i class="el-icon-document"></i>
			<span slot="title">导航三</span>
		</el-menu-item>
	</el-menu>
</template>

<script>
	export default {
		data() {
			return {
				isCollapse: false,
				menu: [{
						path: "/",
						name: "home",
						label: "首页",
						icon: "s-home",
						url: "Home/Home",
					},
					{
						path: "/mail",
						name: "mail",
						label: "商品管理",
						icon: "video-play",
						url: "MailManage/MailManage",
					},
					{
						path: "/user",
						name: "user",
						label: "用户管理",
						icon: "user",
						url: "UserManage/UserManage",
					},
					{
						label: "其他",
						icon: "location",
						children: [{
								path: "/page1",
								name: "page1",
								label: "页面1",
								icon: "setting",
								url: "Other/PageOne",
							},
							{
								path: "/page2",
								name: "page2",
								label: "页面2",
								icon: "setting",
								url: "Other/PageTwo",
							}
						],
					},
				]
			};
		},
		methods: {
			handleOpen(key, keyPath) {
				console.log(key, keyPath);
			},
			handleClose(key, keyPath) {
				console.log(key, keyPath);
			}
		},
		//计算属性
		computed: {
			//没有子菜单
			noChildren() {
				return this.menu.filter(item => !item.children)
			},
			//有子菜单
			hasChildren() {
				return this.menu.filter(item => item.children)
			}
		}
	}
</script>
<style>
	.el-menu-vertical-demo:not(.el-menu--collapse) {
		width: 200px;
		min-height: 400px;
	}
</style>

在这里插入图片描述
  源码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专业135+总分400+华中科技大学824信号与系统考研经验华科电子信息与通信工程,真题,大纲,参考书。

考研成功逆袭985&#xff0c;上岸华科电子信息&#xff0c;初试专业课824信号与系统135&#xff0c;总分400&#xff0c;成绩还是很满意&#xff0c;但是也有很多遗憾&#xff0c;总结一下自己的复习&#xff0c;对于大家复习给些参考借鉴&#xff0c;对自己考研画个句号&#…

解密时序数据库的未来:TDengine Open Day技术沙龙精彩回顾

在数字化时代&#xff0c;开源已成为推动技术创新和知识共享的核心力量&#xff0c;尤其在数据领域&#xff0c;开源技术的涌现不仅促进了行业的快速发展&#xff0c;也让更多的开发者和技术爱好者得以参与其中。随着物联网、工业互联网等技术的广泛应用&#xff0c;时序数据库…

Android自定义验证码输入框

Android自定义验证码输入框 Android开发的验证码输入框&#xff0c;输入够自动触发下一步 一、思路&#xff1a; 自定义验证码控件&#xff0c;监听每一个输入框 二、效果图&#xff1a; 看视频更直观点&#xff1a; Android开发轮子-自定义验证码输入框 三、关键代码&…

软件无线电安全之GNU Radio基础(下)

往期回顾 软件无线电安全之GUN Radio基础(上) 背景 在上一小节中&#xff0c;我们简单介绍和使用了GNU Radio软件的基础功能和模块&#xff0c;同时通过GNU Radio Companion&#xff08;GRC&#xff09;创建了简单的流程图&#xff0c;展示了信号生成、处理和输出的流程。最后…

vuedraggable

官方文档&#xff1a;https://www.npmjs.com/package/vuedraggable 中文文档&#xff1a;http://www.itxst.com/vue-draggable/tutorial.html 案例下载地址&#xff1a; https://github.com/SortableJS/Vue.Draggable.git vuedraggablehttps://sortablejs.github.io/Vue.Dr…

linux基于systemd自启守护进程 systemctl自定义服务傻瓜式教程

系统服务 书接上文: linux自启任务详解 演示系统:ubuntu 20.04 开发部署项目的时候常常有这样的场景: 业务功能以后台服务的形式提供,部署完成后可以随着系统的重启而自动启动;服务异常挂掉后可以再次拉起 这个功能在ubuntu系统中通常由systemd提供 如果仅仅需要达成上述的场…

windows将文件推给Android真机/实机

记录一下 因为以前只试过从真机实机中将文件推给windows 但是从windows只简单复制粘贴的话会一直报错。 1.电脑安装adb 2.手机开启开发者模式 usb调试 3.usb连接选择文件传输 4.推送命令adb push 文件路径 /sdcard/download 步骤1和2和3不作赘述&#xff0c;可以搜相关配置教程…

区块链钱包开发:全面功能设计方案解析

区块链钱包是连接用户与区块链世界的核心工具&#xff0c;为用户提供了存储、管理和交易加密资产的便捷途径。随着区块链应用的广泛普及&#xff0c;钱包的功能需求和技术复杂度也在不断增加。如何设计和开发一款功能全面、安全可靠的区块链钱包&#xff0c;成为区块链项目成功…

超详细搭建PhpStorm+PhpStudy开发环境

刚开始接触PHP开发&#xff0c;搭建开发环境是第一步&#xff0c;网上下载PhpStorm和PhpStudy软件&#xff0c;怎样安装和激活就不详细说了&#xff0c;我们重点来看一看怎样搭配这两个开发环境。 前提&#xff1a;现在假设你已经安装完PhpStorm和PhpStudy软件。 我的PhpStor…

双十二投影仪推品牌推荐哪个?当贝卓越画质与智能系统的完美结合

双十二购物狂欢节临近&#xff0c;加上国补至高20%的优惠&#xff0c;这场投影仪年末战役也成为了各家品牌必争之地。越来越多的朋友都在考虑入手一台投影仪&#xff0c;打造专属的私人家庭影院&#xff0c;在家也能享受影院级影音乐趣。在众多投影仪品牌中&#xff0c;当贝投影…

技术岗面试准备总结

该总结除个人经验外&#xff0c;参考&#xff1a; 求职】手把手教你写求职简历&#xff0c;8分钟掌握简历的套路科注意事项&#xff01; 【求职干货】从面试官的角度&#xff0c;教你如何面试中小企业研发岗 面试一家公司&#xff0c;需要做哪些准备&#xff1f;&#xff08;…

Quill富文本实现内容自定义格式format

在使用quill富文本编辑器时&#xff0c;我们输入文本会被作为类似DOM节点的数据对象存储在内部&#xff0c;渲染时生成相应的DOM节点。这是quill的文档模型Parchment,它提供了多种内容节点类型&#xff0c;如Inline \ Block \ Embed等。 quill 扩展了 Parchment 提供的的基础类…

MQTT知识要点

介绍 MQTT (Message Queuing Telemetry Transport) 是一种轻量级的发布/订阅消息协议&#xff0c;专为低带宽环境M2M而设计。是物联网&#xff08;IoT&#xff09;最常用的消息传递协议。 轻量高效双向通信可以扩展以连接数百万台物联网设备。可靠的消息传递&#xff08;支持…

Linux -基础指令3

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【Linux】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4da; 前言⏰ 时间相关&#x1f511; 概念一&#xff1a;日志 date&#x1f511; 概念二&#xff1a;时间戳 Cal &#x1f50d; 查找findwhichwhereisgr…

如何在 Redis 上配置 SSL/TLS ?

在数据泄露非常普遍的时代&#xff0c;数据安全传输对于各种规模的应用程序来说都变得至关重要。 Redis 作为一种非常流行的内存数据结构存储&#xff0c;被广泛用于缓存、消息代理和数据库。鉴于其广泛使用&#xff0c;使用SSL/TLS 加密保护 Redis 连接&#xff0c;对于保护敏…

选择大于一切!Amazon Bedrock重塑大模型领域的竞合规则

文 | 智能相对论 作者 | 陈泊丞 早些年&#xff0c;“百模大战”打得火热&#xff0c;但是随着模型发展的深入&#xff0c;人们发现如果只是争抢市场份额&#xff0c;意义并不大&#xff0c;产业链上下游需要协作共进&#xff0c;才能为市场和社会提供更优质的生成式AI服务。…

MySQL 性能优化详解

MySQL 性能优化详解 硬件升级系统配置优化调整buffer_pool数据预热降低日志的磁盘落盘 表结构设计优化SQL语句及索引优化SQL优化实战案例 MySQL性能优化我们可以从以下四个维度考虑&#xff1a;硬件升级、系统配置、表结构设计、SQL语句和索引。 从成本上来说&#xff1a;硬件升…

RK3568平台开发系列讲解(pinctrl 子系统篇)pinctrl_debug

🚀返回专栏总目录 文章目录 1. Overview2. debug信息2.1 pinctrl-devices2.2. pinctrl-handles2.3. pinctrl-handles3. debug信息3.1. 查看(pinctrl_register_pins)注册了哪些pins3.2. 查看pin groups;3.3. 查看每种functions所占用的gpio groups信息:3.4. pinconf沉淀、…

目标跟踪算法:SORT、卡尔曼滤波、匈牙利算法

目录 1 目标检测 2 卡尔曼滤波 3《从放弃到精通&#xff01;卡尔曼滤波从理论到实践》视频简单学习笔记 3.1 入门 3.2 进阶 3.2.1 状态空间表达式 3.2.2 高斯分布 3.3 放弃 3.4 精通 4 匈牙利算法 5 《【运筹学】-指派问题&#xff08;匈牙利算法&#xff09;》视…

5G Multicast/Broadcast Services(MBS) (八) MBS多播DRX

这里简单看下多播DRX的内容。 1 MBS multicast 对于MBS多播,RRC可配置 MAC entity使其具备per G-RNTI 或per G-CS-RNTI DRX 功能,从而控制 UE 对 MAC entity的G-RNTI和G-CS-RNTI 的 PDCCH 监听活动。当处于 RRC_CONNECTED 状态时,如果为 G-RNTI 或 G-CS-RNTI 配置了多播…