文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
菜单组件及跳转
在 src\renderer\components 目录下新建 BarLeft.vue 的组件,这是整个应用的侧边栏组件,里面放置应用程序的菜单:
<template>
<div class="BarLeft">
<div class="userIcon">
<img src="../assets/avatar.jpg" alt="">
</div>
<div class="menu">
<router-link v-for="item in mainWindowRoutes" :to="item.path" :class="['menuItem', {'selected': item.isSelected}]">
<i :class="['icon', item.isSelected ? item.iconSelected : item.icon]"></i>
</router-link>
</div>
<div class="setting">
<div class="menuItem">
<i class="icon icon-setting" />
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue';
import { useRoute } from 'vue-router';
let mainWindowRoutes = ref([
{ path: '/WindowMain/Chat', isSelected: true, icon: 'icon-chat', iconSelected: 'icon-chat' },
{ path: '/WindowMain/Contact', isSelected: false, icon: 'icon-tongxunlu1', iconSelected: 'icon-tongxunlu' },
{ path: '/WindowMain/Collection', isSelected: false, icon: 'icon-shoucang1', iconSelected: 'icon-shoucang' },
])
let route = useRoute();
watch(
() => route,
() => mainWindowRoutes.value.forEach(v => v.isSelected = v.path === route.fullPath),
{
immediate: true,
deep: true,
})
</script>
<style scoped lang="scss">
.BarLeft {
width: 54px;
height: 100%;
display: flex;
flex-direction: column;
background: rgb(46, 46, 46);
-webkit-app-region: drag;
}
.userIcon {
height: 84px;
padding-top: 36px;
box-sizing: border-box;
img {
width: 34px;
height: 34px;
margin-left: 10px;
}
}
.menu {
flex: 1;
}
.menuItem {
height: 44px;
line-height: 44px;
text-align: center;
padding-left: 12px;
padding-right: 12px;
display: block;
text-decoration: none;
color: rgb(126, 126, 126);
cursor: pointer;
-webkit-app-region: no-drag;
i {
font-size: 22px;
}
&:hover {
color: rgb(141, 141, 141);
}
}
.selected {
color: rgb(7, 193, 96);
&:hover {
color: rgb(7, 193, 96);
}
}
.setting {
margin-bottom: 5px;
}
</style>
- 样式为 menu 的 div 用于存放主窗口的菜单,通过 mainWindowRoutes 数组里的数据来渲染菜单。
- router-link 组件会被渲染成 a 标签,当用户点击菜单时,主窗口的二级路由发生跳转(src\renderer\window\WindowMain.vue)。
- 通过 watch 方法监控路由跳转的行为,当路由跳转后,遍历 mainWindowRoutes 数组内的对象,取消以前选中的菜单,选中新的菜单。
- 由于 mainWindowRoutes 是一个 Ref 对象,所以菜单被选中或取消选中之后,相应的菜单样式(和菜单内的字体图标)也会跟着变化。
在 WindowMain.vue 中添加如下代码:
<script setup lang="ts">
import { ipcRenderer } from "electron";
import { onMounted } from "vue";
import BarLeft from "../components/BarLeft.vue";
onMounted(() => {
ipcRenderer.invoke("showWindow");
});
</script>
<template>
<BarLeft />
<div class="pageBox">
<router-view />
</div>
</template>
<style scoped lang="scss">
.pageBox {
flex: 1;
height: 100%;
border-top: 1px solid #e6e6e6;
box-sizing: border-box;
display: flex;
margin-top: -1px;
}
</style>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论