vue 导航栏跳转、选中效果

方法一:组件传值(父组件传值导航栏组件)

父组件代码

<template>
	<div id="brand">
		<Header :ishidden="false" :active="active"></Header>   //组件传值active
		<Footer></Footer>
	</div>
</template>

<script>
	import Header from "../components/Header.vue"
	import Footer from "../components/Footer.vue"
	export default {
		data() {
			return {
				active:"/brand"                                 
			}
		},
		mounted() {
			
		},
		methods: {
			
		},
		components: {
			Header,Footer
		}
	}
</script>

子组件代码

<template>
<div class="header">
		<div :class="ishidden==true?'header-top':'no-header'">
			<img class="logo" src="../assets/image/logo.png" />
			<div class="m-navBg" @click="NavClose"></div>
			<ul class="nav">
				<li v-for="navs in nav">
				<router-link :class="active==navs.href?'active':'non'" :to="navs.href" @click.native="istem(navs.href)">{{ navs.title }}</router-link>
				</li>   
				//通过组件传值获取active 并用三目添加class
			</ul>
		</div>
</div>
</template>
<script>
export default { 
	name: 'Header',
  	props:{                       //子组件获取传值
		ishidden: '',
		active: ''
	},
	data() {
		return {
		}
	},
	mounted() {
			
	},
	methods: {
		
	},
}
</script>

方法二:导航栏组件获取当前页面网址

父组件代码

<template>
	<div id="brand">
		<Header :ishidden="false"></Header>   //ishidden是判断显示隐藏banner
		<Footer></Footer>
	</div>
</template>

<script>
	import Header from "../components/Header.vue"
	import Footer from "../components/Footer.vue"
	export default {
		data() {
			return {

			}
		},
		mounted() {
			
		},
		methods: {
			
		},
		components: {
			Header,Footer
		}
	}
</script>

子组件代码

<template>
	<div class="header">
		<div :class="ishidden==true?'header-top':'no-header'">
			<img class="logo" src="../assets/image/logo.png" />
			<div class="m-navBg" v-on:click="NavClose"></div>
			<ul class="nav">
				<li v-for="navs in nav">
					<router-link :class="isSelect==navs.href?'active':'non'" :to="navs.href" @click.native="istem(navs.href)">{{ navs.title }}</router-link>
					//router-link 执行点击事件的方法@click.native
					</li>
			</ul>
		</div>
	</div>
</template>
<script>
	export default {
		name: 'Header',
		data() {
			return {
				isSelect: '/',                 //默认选中主页
			}
		},
		created: function () {
			this.isSelect = this.$route.path;  //获取当前页网址并赋值给isSelect
		}
	}
</script>

方法三:使用本地存储 (这里就不做过多介绍)

注:以上方法亲测有效

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现步骤: 1. 在Vue中定义动态导航栏的数据结构,包括菜单项的名称、路由路径、子菜单等。 2. 在Vue组件中使用v-for循环渲染动态导航栏,使用router-link组件实现路由跳转。 3. 在Spring Boot中编写Controller或RestController,返回动态导航栏所需的数据结构。 4. 在前端使用axios或fetch等工具,发送异步请求获取动态导航栏数据,在mounted生命周期钩子函数中初始化动态导航栏的数据。 5. 根据用户权限或其他条件,动态生成导航栏的菜单项及子菜单。 6. 根据当前路由路径,动态设置导航栏菜单项的选中状态。 示例代码如下: Vue组件部分: ```html <template> <div class="nav"> <ul> <li v-for="(menu, index) in menus" :key="menu.id"> <router-link :to="menu.path" :class="{active: isActive(menu)}">{{menu.name}}</router-link> <ul v-if="menu.children"> <li v-for="(child, i) in menu.children" :key="child.id"> <router-link :to="child.path">{{child.name}}</router-link> </li> </ul> </li> </ul> </div> </template> <script> import axios from 'axios' export default { data () { return { menus: [] } }, methods: { isActive (menu) { return this.$route.path === menu.path } }, mounted () { axios.get('/api/menus').then(res => { this.menus = res.data }) } } </script> <style> .nav { background-color: #f5f5f5; padding: 10px; } .nav ul { list-style: none; padding: 0; margin: 0; } .nav li { display: inline-block; margin-right: 10px; } .nav li ul { display: none; position: absolute; top: 100%; left: 0; z-index: 1000; background-color: #fff; padding: 0; margin: 0; } .nav li:hover > ul { display: block; } .nav li ul li { display: block; margin: 0; } .nav li ul li:hover { background-color: #f5f5f5; } .nav .active { color: red; } </style> ``` Spring Boot控制器部分: ```java @RestController @RequestMapping("/api") public class MenuController { @GetMapping("/menus") public List<Menu> getMenus() { // 根据用户权限或其他条件,动态生成菜单项及子菜单 List<Menu> menus = new ArrayList<>(); Menu menu1 = new Menu(1L, "首页", "/home"); Menu menu2 = new Menu(2L, "管理中心", "/admin"); Menu menu3 = new Menu(3L, "用户中心", "/user"); List<Menu> children = new ArrayList<>(); children.add(new Menu(4L, "个人信息", "/user/info")); children.add(new Menu(5L, "订单管理", "/user/order")); menu3.setChildren(children); menus.add(menu1); menus.add(menu2); menus.add(menu3); return menus; } } class Menu { private Long id; private String name; private String path; private List<Menu> children; // getter和setter省略 } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值