首页 > 其他分享 >ruoyi-vue 界面框架构造

ruoyi-vue 界面框架构造

时间:2024-09-11 14:06:51浏览次数:12  
标签:vue 界面 name route tag ruoyi cacheRoute 组件 路由

界面框架:

image
我采用了flex布局,先分左右,然后右侧再分上下。

步骤:

1. 首先实现简单的菜单

1.1 菜单是个菜单项数组 []

1.2 菜单项结构 例子

{
  id:'001',
  name: '历史轨迹', // 菜单名称
  isTitle: true, // 表示可以展开
  level: 1, // level控制缩进,vue动态class使用
  expand: true, // 展开状态,
  icon: require('@/assets/svg/track.svg'),
  children:[ // 根据需要配置
  	{
  		id:'002',
  		name: '人员轨迹', 
  		isTitle: false, // false表示是子节点,点击访问,而不是展开
  		level: 2, // 
  		icon: require('@/assets/svg/person.svg'),
  		route:{
  			name:'historyTrack' // 这个name要和路由中配置的name保持一致,这个很关键
  		}
  	}
  ]
}

1.3 新建一个菜单,就叫 TreeMenu

下面代码就是TreeView菜单组件,里面递归了自己

<template>
    <ul>
  	<li v-for="item in menu" :key="item.id">
  		<div :class='[item.isTitle? "menu-title": "menu-item", "level"+ item.level]' @click="toggleMenu(item)
  			<img v-show="item.icon" :src="item.icon" />
  			<span>{{item.name}}</span>
  		</div>
  		<TreeMenu v-if="item.children && item.expand" :menu="item.children" />
  	</li>
    </ul>
</template>
  • "level-"+ item.level: 这是我设计的样式缩进level-1到level-5, panding-left每次增加12px
  • TreeMenu 递归调用自己绘制形成多级菜单
  • TreeMenu 有一个props,传递的数据结构就是 上面1.2定义的菜单项结构
  • li标签里的div中添加click事件 toggleMenu,负责处理是新打开一个菜单项对应的路由还是展开菜单,如:
toggleMenu(item){
	const isTitle = item.isTitle
  if(isTitle){ // 展开 or 折叠
  	this.$emit('expand', item) // 把该数据传给父组件,因为菜单数据是props从父组件传过来的,子组件修改会有警告,所以传事件给父组件,让父组件修改
  }else{ // 打开菜单页面
  	if(this.$router.currentRoute.name !== item.route.name){ // 这个是为了防止点击已打开的页面,导致route模块告警说打开同一路由
  		this.$route.replace(item.route.name)
  	}
  }
}

2. 然后实现AppMain:就是上面界面框架的内容部分

image

2.1 主要是<router-view></router-view>来展现菜单对应的路由里组件的内容

```HTML
<template>
	<section>
		<keep-alive :max="10" :include="cacheRoute">
			<router-view :key="key" />
		</keep-alive>
	</section>
</template>

<script>
	// 省略乱七八糟的 ...
	conputed:{
		cacheRoute(){
			const route = this.$store.getters['history/cacheRoute'] // 这个是Store中保存的已打开的路由,下面介绍,是个路由数组
			return route.map(e=>e.name) 
		},
		key(){
			return this.$route.path
		}
	}
</script>
```
  • keep-alive 表示保活,就是你在打开其他组件的时候,当前组件不会销毁,下次打开不经历beforecreate、created、...、mounted等生命周期,从vue-devtools中也可以看到,他依然挂在AppMain下面,但是它是灰色的。注意:需要保活的组件vue配置的name属性必须配置且唯一。 详细信息见:keep-alive 官方文档
  • keep-alive:max="10 表示最多保活十个组件,第十一个进来,第一个则移除,不再保活,防止占用系统过多资源,根据实际需要调整该数
  • keep-alive:include="cacheRoute" 表示保活的组件包括这些。如果想让某个组件销毁,不再保活,则将组件对应的路由名称从cacheRoute中移除即可
  • router-view 个人理解就是用来展示当前路由对应组件的内容。 对这个理解不是太深,看了文档,模模糊糊的。详细信息见:router-view 官方文档
  • router-view:key="key" 是打开的路由路径

3. 所打开页面的tag

<template>
	<!-- 这个是上面的一长条,就是界面框架右上方的空间 -->
	<div>
		<!-- 这个就是一个个小的tag标签 -->
		<route-link v-for="item in cacheRoute" :ref="item.path" :key="item.path" :to="{path:item.path, fullPath:item.fullPath}" custom :class="{'active-tab':activeRoute === item.name}" @click.middle.native="closeTab(item)">
			<div>
				{{item.meta.title}} <!-- 路由配置的标题 -->
				<i class="close-btn" v-if="item.meta.closable!== false" @click.prevent="closeTab(item)" /> <!-- 关闭按钮,根据路由中配置的属性来决定是否显示关闭按钮从而操作该tag是否可以关闭,路由相关的数据结构下面贴出来 -->
			</div>
		</route-link>
	</div>
</template>
  • route-link:它组件支持用户在具有路由功能的应用中 (点击) 导航。 通过 to 属性指定目标地址,默认渲染成带有正确链接的<a>标签,可以通过配置 tag 属性生成别的标签(高版本中会抛出警告,说不再支持这个属性,请使用custom)。详细信息见:router-link 官方文档
  • <route-link v-for="item in cacheRoute"cacheRoute中保存的是在keep-alive保活的组件路由,使用store(VueX)管理
  • closeTab 方法可以将当前tag所代表的路由,从cacheRoute中移除,然后触发keep-alive的includes所绑定的数据,从keep-alive中移除,移除后会自动执行生命周期的destroyed 钩子进行销毁

4. 路由数据结构

4.1 例子

{
	path:'/home',
	name:'home', // 这个name要和1-2的菜单配置里route{name}一致
	meta:{
		title: '历史主页', // router-link 显示的tag标题
		closable: false, // 这个是是否可以关闭
	},
	component:()=>import('@/views/home/home.vue'),
}
  • name: 1-2的菜单配置里route{name} 要和它一致
  • meta:它可以根据自己需要填充属性,title为 tag显示内容,closable是是否可以关闭

5. Store(VueX)

5.1 相关Store(VueX)的数据结构

{
	cacheRoute: Array<Route>, // 实现:添加、删除(在组件被挂载、销毁的时候操作)
	activeRoute: string,// 在挂载的时候操作,主要是为了修改css,高亮当前选择的菜单项和tag
}

6. mixin

6.1 mixin 内容

export default({
	created(){
		const cacheRoute = this.$route.getters['history/cacheRoute'] // 5.1 中的 cacheRoute,是个路由对象数组
		if(cacheRoute.length === 0){ // 如果有路由是不可被关闭的,那么他将一直存在cacheRoute中,如果不在,那么就添加进去
			// 找到不可关闭的路由,这里似乎可以通过route的mata属性配置的closable进行判定,我这样是写死的,固定住了
			const route=this.$router.getRoutes().find(e=>e.name == "home") 
			this.$store.commit('history/addCacheRoute', route) // 添加进cacheRoute,这样就能显示在tag里面了
		}
		this.$store.commit('history/addCacheRoute', this.$route.currentRoute) // 将当前的路由加入 cacheRoute
		this.$store.commit('history/setActiveRoute', this.$route.currentRoute.name)// 将当前路由设为活动的,便于高亮tag和菜单项
	},
	actived(){ // 这个生命周期的钩子是keep-alive的,激活当前组件时触发,还有个deactivated,取消激活当前组件时触发
		this.$store.commit('history/setActiveRoute', this.$route.currentRoute.name)// 将当前路由设为活动的,便于高亮tag和菜单项
	}
})

注意:该mixin需要在组件中混入

7. 界面组件层级

image

8. 依照7中图片结构实现思路

8.1 先设计路由,计算菜单有哪些,在Vue项目Router中设计好路由信息

8.2 HistoryHome组件中放入左上下模块:SideViewTagViewAppMain三个模块:菜单、标签栏、显示内容区域

8.3 在SideView中对着设计好的路由构造menu数据,对vue的Router理解比较深者可以根据路由来生成menu数据,我们项目需要自己手动构造menu数据。然后把构造好的menu数据给TreeView组件,使其生成菜单项,并绑定点击事件。在点击事件中,处理点击对象是展开/折叠或者路由跳转打开新页面。

8.4 新页面混入上面写的minxin,在created生命周期中将自身的路由对象存入StorecacheRoute,方便TagView组件遍历展示。同时,将自身的name存入StoreactiveRoute,便于SideViewTagView高亮。

8.5 TagView利用router-link,来实现组件跳转。遍历StorecacheRoute,填充route-link所需要的属性,添加关闭按钮,实现关闭tag方法。在关闭tag方法中,只需要将tag对应的route从cacheRoute移除即可。router-link的tag属性不能用了,我使用css控制样式。

8.6 AppMain组件利用keep-alive 进行组件保活,即发生路由跳转,但是页面不执行销毁操作。使用router-view显示当前路由对应的组件内容。采用computed计算属性获取cacheRoute中存放的路由name属性,形成数组给keep-alive,这样在 打开新页面/需要关闭页面 时,双向绑定会触发,keep-alive会自动保活/取消保活组件,与操作联动起来。然后在router-view中将当前路由的path给出即可。

标签:vue,界面,name,route,tag,ruoyi,cacheRoute,组件,路由
From: https://www.cnblogs.com/echo-lovely/p/18406777

相关文章

  • 【JAVA开源】基于Vue和SpringBoot员工绩效考核系统
    本文项目编号T021,文末自助获取源码\color{red}{T021,文末自助获取源码}......
  • 【JAVA开源】基于Vue和SpringBoot大学生入学审核系统
    本文项目编号T022,文末自助获取源码\color{red}{T022,文末自助获取源码}......
  • 【JAVA开源】基于Vue和SpringBoot房屋租赁系统
    本文项目编号T020,文末自助获取源码\color{red}{T020,文末自助获取源码}......
  • Vue3项目文件作用
    在Vue3项目中,文件和文件夹的组织结构对于项目的可维护性、可扩展性和团队协作至关重要。以下是一些Vue3项目中常见文件和文件夹的作用:package.json:项目的元数据文件,包括项目名称、版本、描述、作者、依赖项等。定义了项目的脚本,如启动、构建、测试等命令。public/:存......
  • 基于Java+Vue+Mysql的人力资源管理系统:简单易用,高效协同(项目代码)
    前言:eHR(ElectronicHumanResources)人力资源管理系统是一个综合性的软件平台,用于管理组织的人力资源相关的各种活动和数据。该系统可以显著提高人力资源部门的工作效率,确保数据准确性和一致性,同时提供决策支持。以下是eHR人力资源管理系统的六个主要模块及其功能的简要介绍:......
  • SpringBoot+Neo4j+Vue+Es集成ES全文检索、Neo4J知识图谱、Activiti工作流的知识库管理
    在数字化高度普及的时代,企事业机关单位在日常工作中会产生大量的文档,例如医院制度汇编,企业知识共享库等。针对这些文档性的东西,手工纸质化去管理是非常消耗工作量的,并且纸质化查阅难,易损耗,所以电子化管理显得尤为重要。【springboot+elasticsearch+neo4j+vue+activiti】实现数......
  • Vue模板语言入门
    一、绑定事件监听        接上集,如果想看vue基础请移步主页      1、默认事件形参event:            即在对象触发事件的函数的默认参数,即使在标签内触发函数位置没写event参数也可以在script函数中直接写:函数名(event){函......
  • vue学习
    学习目标一周掌握VUE的使用(陆续更新中)学习内容:了解vue的概念及特点引入vue掌握vue核心知识笔记产出:一、vue介绍Vue.js,我们通常简称为Vue,是一个用于构建用户界面的渐进式JavaScript框架。它就像是一个超级强大的工具箱,帮助开发者更轻松、更高效地创建网页和应用程......
  • 【卷起来】VUE3.0教程-06-组件详解
    ============各位看官,点波关注和赞吧===========组件允许我们将UI划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被组织成层层嵌套的树状结构:这和我们嵌套HTML元素的方式类似,Vue实现了自己的组件模型,使我们可以在每个组件内封装......
  • asp.netcore8 + vue3 + mysql 自用记账项目(四)项目部署
    一、生成后台api服务 1、在系统生成的Dockerfile基础上,添加时区标识FROMmcr.microsoft.com/dotnet/aspnet:8.0ASbaseENVTZAsia/ShanghaiRUNln-snf/usr/share/zoneinfo/$TZ/etc/localtime&&echo$TZ>/etc/timezoneWORKDIR/appEXPOSE80EXPOSE443FROMmcr.......