Vue3点击侧边导航栏完成切换页面内组件全过程(WEB)

 更新时间:2023年06月12日 11:37:46   作者:li-xun  
写页面的时候都会用到一些导航栏、点击不同的部分切换不同的页面,下面这篇文章主要给大家介绍了关于Vue3点击侧边导航栏完成切换页面内组件的相关资料,需要的朋友可以参考下

效果

点击左侧导航,右面页面切换。

思路

使用router-view显示点击后需要切换的组件,需要先完成网页的结构。侧面导航 + 页面显示部分

如:

导航加显示

设置一个class属性,点击元素时给当前元素额外添加一个class类。给导航中每个点击项添加上点击事件,当点击当前项时其它项的class变成原本的,当前元素添加一个当前点击的class类,而组件切换则由router完成,使用router-link to 完成路由路径切换。

当前点击模式类代码:

.isclick {
		background: #e9feff;
		color: #0bbfbc;
	}

过程

获取当前点击DOM并添加点击class

这里需要注意,触发事件的元素对象(不一定是绑定事件的对象,会因为事件冒泡变化),所以我们需要获取绑定事件的元素对象。

  • $event:当前触发的是什么事件
  • $event.target:触发事件的元素对象(不一定是绑定事件的对象)
  • $event.currentTarget:绑定事件的元素对象

此处需要使用: e.currentTarget

改变选中元素的class: e.currentTarget.className = ‘nav-item isclick’

其中nav-item为未点击时的navitem样式类,isclick为点击后更改的样式类,原来样式只有一个nav-item,再添加一个isclick。

将其它的导航未点击项isclick样式类去除

得到点击项的其它兄弟节点

var domList = e.currentTarget.parentNode.children

parentNode 是得到父节点

children 是得到子节点

当前元素的父节点的所有子节点,是一个列表

将所有节点的点击样式类去除

for(let d=0;d<domList.length;d++){
	domList[d].className = 'nav-item'
}

遍历当前所有节点的兄弟节点,并修改class。

完整代码

导航代码

导航组件代码:

<template>
	<div class="nav">
		<ul>
			<li v-for="item in NavList" class="nav-item" @click="clickNav($event)">
				<div>
					<img class="nav-icon" :src="item.icon" width="20px" height="20px" alt="sy" />
					<router-link :to="item.url">{{item.title}}</router-link>
				</div>
			</li>
		</ul>
		<div class="nav-img-box" style="margin-top: 108px;">
			<img src="@/assets/装饰图.png" alt="zs" />
		</div>
	</div>
</template>
<script setup>
import { ref,reactive } from 'vue'
var NavList = reactive([
	{
		title: "合作伙伴",
		url: "/partner",
		icon: require("@/assets/首页-选中.png")
	},
	{
		title: "客户列表",
		url: "/customer",
		icon: require("@/assets/客户列表.png")
	},
	{
		title: "订单列表",
		url: "/order",
		icon: require("@/assets/财务列表.png")
	},
	{
		title: "物料列表",
		url: "/materials",
		icon: require("@/assets/标签列表.png")
	},
	{
		title: "成员管理",
		url: "/corpuser",
		icon: require("@/assets/员工列表.png")
	},
	{
		title: "收益概览",
		url: "/income",
		icon: require("@/assets/员工列表.png")
	},
	{
		title: "价格配置",
		url: "/price",
		icon: require("@/assets/员工列表.png")
	},
	{
		title: "系统设置",
		url: "/setting",
		icon: require("@/assets/员工列表.png")
	}
])
function clickNav(e) {
	var domList = e.currentTarget.parentNode.children
	for(let d=0;d<domList.length;d++){
		domList[d].className = 'nav-item'
	}
	console.log('点击',e.currentTarget)
	e.currentTarget.className = 'nav-item isclick'
}
</script>
<style scoped>
	li {
		list-style-type: none;
	}
	a {
		text-decoration: none;
		color: #39475A;
	}
	.nav {
		width: 200px;
		height: 100%;
		background: #FFFFFF;
		box-shadow: 3px 0px 6px 0px rgba(82, 82, 82, 0.14);
	}
	.nav ul {
		margin-top: 32px;
		padding: 0;
	}
	.nav-item {
		width: 200px;
		height: 46px;
		font-family: PingFangSC-Medium;
		font-size: 16px;
		color: #39475A;
		letter-spacing: 0;
		line-height: 46px;
		font-weight: 500;
	}
	.nav-item div {
		margin-left: 17px;
		height: 46px;
		line-height: 46px;
	}
	.nav-item div img {
		width: 20px;
		height: 20px;
	}
	.nav-icon {
		vertical-align: middle;
		margin-right: 7px;
		padding-bottom: 6px;
	}
	.isclick {
		background: #e9feff;
		color: #0bbfbc;
	}
	.nav-img-box img {
		width: 200px;
		height: 416px;
	}
</style>

代码中的icon: require(“@/assets/员工列表.png”)为导航图标,需要注意,如果不用require,直接写图片的地址的话可能出现无法找到图片的问题,图片的地址在html中使用时会被转码,出现类似%E9%A6%96%E9%A1%B5-%E9%80%89%E4%B8%AD.png的情况。

显示页面代码

<template>
  <div class="page-body">
      <PageNav></PageNav>
      <router-view />
  </div>
  <div class="bottom">
    <PageBottom></PageBottom>
  </div>
</template>
<script setup>
import PageNav from "@/components/PageNav"
import PartnerView from "@/views/PartnerView"
import PageBottom from "@/components/PageBottom.vue"
</script>
<style scoped>
.page-body {
  display: flex;
}
</style>

其中PageNav为前面的导航代码

路由设置

router.js中代码如下

import { createRouter, createWebHistory } from 'vue-router'
import PartnerView from '../views/PartnerView.vue'
import CustomerView from '../views/CustomerView.vue'
import OrderView from '@/views/OrderView'
import MaterialsView from '../views/MaterialsView'
import CorpUserView from '@/views/CorpUserView'
import InComeView from '@/views/InComeView'
import PriceView from '@/views/PriceView'
import SettingView from '@/views/SettingView'
const routes = [
  {
    path: '/',
    name: 'index',
    component: PartnerView,
    redirect: 'partner',
  },
  {
    path: '/partner',
    name: 'partner',
    component: PartnerView
  },
  {
    path: '/customer',
    name: 'customer',
    component: CustomerView
  },
  {
    path: '/order',
    name: 'order',
    component: OrderView
  },
  {
    path: '/materials',
    name: 'materials',
    component: MaterialsView
  },
  {
    path: '/corpuser',
    name: 'corpuser',
    component: CorpUserView
  },
  {
    path: '/income',
    name: 'income',
    component: InComeView
  },
  {
    path: '/price',
    name: 'price',
    component: PriceView
  },
  {
    path: '/setting',
    name: 'setting',
    component: SettingView
  }
]
const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})
export default router

总结

到此这篇关于Vue3点击侧边导航栏完成切换页面内组件的文章就介绍到这了,更多相关Vue3切换页面内组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue实现移动端弹出键盘功能(防止页面fixed布局错乱)

    vue实现移动端弹出键盘功能(防止页面fixed布局错乱)

    这篇文章主要介绍了vue 解决移动端弹出键盘导致页面fixed布局错乱的问题,通过实例代码给大家分享解决方案,对vue 移动端弹出键盘相关知识感兴趣的朋友一起看看吧
    2022-04-04
  • Vue+iview+webpack ie浏览器兼容简单处理

    Vue+iview+webpack ie浏览器兼容简单处理

    这篇文章主要介绍了Vue+iview+webpack ie浏览器兼容简单处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Vue3如何根据搜索框内容跳转至本页面指定位置

    Vue3如何根据搜索框内容跳转至本页面指定位置

    在开发中我们经常遇到这样的需求,根据要求跳转至本页面指定位置,这篇文章主要给大家介绍了关于Vue3如何根据搜索框内容跳转至本页面指定位置的相关资料,需要的朋友可以参考下
    2022-11-11
  • vue el-table字段点击出现el-input输入框,失焦保存方式

    vue el-table字段点击出现el-input输入框,失焦保存方式

    这篇文章主要介绍了vue el-table字段点击出现el-input输入框,失焦保存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 解决elementUI 切换tab后 el_table 固定列下方多了一条线问题

    解决elementUI 切换tab后 el_table 固定列下方多了一条线问题

    这篇文章主要介绍了解决elementUI 切换tab后 el_table 固定列下方多了一条线问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • 在Vue开发过程中解决和预防内存泄漏问题的方法详解

    在Vue开发过程中解决和预防内存泄漏问题的方法详解

    Vue作为一款流行的前端框架,已经在许多项目中得到广泛应用,然而,随着我们在Vue中构建更大规模的应用程序,我们可能会遇到一个严重的问题,那就是内存泄漏,因此,我们需要认识到在Vue开发过程中,内存泄漏问题的重要性,本文将给大家介绍如何解决和预防内存泄漏问题
    2023-10-10
  • vue mounted组件的使用

    vue mounted组件的使用

    这篇文章主要介绍了vue mounted组件的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • vue+axios实现post文件下载

    vue+axios实现post文件下载

    这篇文章主要为大家详细介绍了vue+axios实现post文件下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • vant-image本地图片无法显示的解决方式

    vant-image本地图片无法显示的解决方式

    这篇文章主要介绍了vant-image本地图片无法显示的解决方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 在Vue中如何实现打字机的效果

    在Vue中如何实现打字机的效果

    这篇文章主要介绍了在Vue中如何实现打字机的效果,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论