vue根据定义data的变量修改elementui 导航二级菜单样式 解决适配一级菜单宽度问题

在做项目的时候需要根据导航栏每行的宽度改变二级菜单宽度的显示,因为elementui导航样式默认最小宽度200px,源码如下:

.el-menu--collapse .el-menu .el-submenu, .el-menu--popup {
    min-width: 200px;
}

需要动态改变min-width的值。

解决:

  • 导航点击事件:在点击展开菜单@open事件中判断展开导航的index,根据不同的导航赋值不同的width。
  • CSS设置:一开始考虑通过css动态改变样式的方法,给变量赋值 this.$el.style.setProperty("--width",this.width);但是由于elementui菜单的二级菜单脱离文档流,不在el里修改样式所以采取
let element = document.querySelector(".el-menu--popup")
element.style.width = this.width

代码:

<template>
	<div class="container">
		<!-- 导航栏顶部 -->
		<div class="top-main">
			<el-row >
				<el-col class="menu-item" :xs="18" :sm="18" :md="18" :lg="18" :xl="19">
					<el-menu 
					ref="menu"
					:default-active="activeIndex" 
					mode="horizontal" 
					:router="true"
					menu-trigger="click"
					:unique-opened="true" //设置点击显示子菜单时控制只展开一个子菜单
					@open="open"
					>
						<el-menu-item index="/dataSource">
							<template>
								<span>数据源管理</span>
							</template>
						</el-menu-item>
						<!-- <el-menu-item index="/assetCatalogueManag">
							<template>
								<span>资产目录配置</span>
							</template>
						</el-menu-item> -->
						<el-submenu index="/assetCatalogueManag" >
							<template slot="title">资产管理</template>
							<el-menu-item index="/assetCatalogueManag">资产目录管理</el-menu-item>
							<el-menu-item index="/dataTable">数据资产管理</el-menu-item>
						</el-submenu>
						<el-submenu index="/dataMarket">
							<template slot="title">数据超市管理</template>
							<el-menu-item index="/dataMarket">API目录管理</el-menu-item>
							<el-menu-item index="/dataAPI">API管理</el-menu-item>
						</el-submenu>
						<el-menu-item index="/dicType">
							<template>
								<span>字典管理</span>
							</template>
						</el-menu-item>
						<el-menu-item index="/userRole" v-if="sys_user_view">
							<template>
								<span>权限管理</span>
							</template>
						</el-menu-item>
						<!-- <el-menu-item index="/dataTable">
							<template>
								<span>数据资产管理</span>
							</template>
						</el-menu-item> -->
						<el-menu-item index="/dataAuth">
							<template>
								<span>审批管理</span>
							</template>
						</el-menu-item>
						
						<el-menu-item index="/systemConfig">
							<template>
								<span>系统配置</span>
							</template>
						</el-menu-item>
					</el-menu>
				</el-col>
			</el-row>
		</div>
	</div>
</template>

<script>
	export default {
		data() {
			return {
				activeIndex: '/assetCatalogueManag'
			}
		},
		methods: {
			initMenuActive(routePath) {
				this.activeIndex = routePath
			},
			open(index) {
				let element = document.querySelector(".el-menu--popup")
				if(index == '/assetCatalogueManag') {
					element.style.minWidth = '135px'
				} else if (index == '/dataMarket') {
					element.style.minWidth = '172px'
				}
			}
		},
		watch: {
			// 监听路由变化
			'$route.path': {
				handler(routePath) {
					this.initMenuActive(routePath)
				},
				immediate: true
			},
		}
	}
</script>

最终效果:

二级菜单宽度自适应父级菜单宽度

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一个简易的 Vue 对话界面示例代码,已经适配了手机端: ``` <template> <div class="container"> <div class="chat-box"> <div class="chat-message" v-for="(message, index) in messages" :key="index"> <div v-if="message.sender === 'user'" class="user-message">{{ message.text }}</div> <div v-else class="bot-message">{{ message.text }}</div> </div> </div> <div class="input-box"> <input v-model="inputText" @keyup.enter="sendMessage" type="text" placeholder="请输入消息..."> <button @click="sendMessage">发送</button> </div> </div> </template> <script> export default { name: 'ChatBox', data() { return { messages: [], inputText: '' } }, methods: { sendMessage() { if (this.inputText.trim() !== '') { this.messages.push({ sender: 'user', text: this.inputText }); this.inputText = ''; // 在此处添加与 AI 的对话逻辑 } } } } </script> <style scoped> .container { display: flex; flex-direction: column; height: 100%; width: 100%; } .chat-box { flex: 1; overflow-y: scroll; padding: 10px; } .chat-message { margin-bottom: 10px; } .user-message { background-color: #EEE; padding: 5px; border-radius: 10px; max-width: 70%; align-self: flex-end; } .bot-message { background-color: #DDD; padding: 5px; border-radius: 10px; max-width: 70%; align-self: flex-start; } .input-box { display: flex; height: 50px; width: 100%; padding: 10px; box-sizing: border-box; } input { flex: 1; border: none; outline: none; padding: 10px; border-radius: 5px; margin-right: 10px; } button { border: none; outline: none; background-color: #07C; color: #FFF; padding: 10px 20px; border-radius: 5px; cursor: pointer; } </style> ``` 该示例代码包含了一个聊天框和一个输入框,用户可以输入消息并发送,发送的消息将显示在聊天框中。你需要在 `sendMessage` 方法中添加与 AI 的对话逻辑,以便实现对话交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值