Vue3点击侧边导航栏完成切换页面组件

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

设置一个class属性,点击元素时给当前元素额外添加一个class类。给导航中每个点击项添加上点击事件,当点击当前项时其它项的class变成原本的,当前元素添加一个当前点击的class类,而组件切换则由router完成,使用router-link to 完成路由路径切换。
当前点击模式类代码:
.isclick {
background: #e9feff;
color: #0bbfbc;
}
这里需要注意,触发事件的元素对象(不一定是绑定事件的对象,会因为事件冒泡变化),所以我们需要获取绑定事件的元素对象。
$event:当前触发的是什么事件
$event.target:触发事件的元素对象(不一定是绑定事件的对象)
$event.currentTarget:绑定事件的元素对象
此处需要使用: e.currentTarget
改变选中元素的class: e.currentTarget.className = ‘nav-item isclick’
其中nav-item为未点击时的navitem样式类,isclick为点击后更改的样式类,原来样式只有一个nav-item,再添加一个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
以上,仅记录自己的解决办法,如您有更好的思路,欢迎在评论区留言
感谢点赞,如有帮助可以帮忙收藏关注,感谢!
我正在从erb文件切换到HAML。我将hamlgem添加到我的系统中。我创建了app/views/layouts/application.html.haml文件。我应该只删除application.html.erb文件吗?此外,仍然有/public/index.html文件被呈现为默认页面。我想创建自己的默认index.html.haml页面。我应该把它放在哪里以及如何使系统呈现该文件而不是默认索引文件?谢谢! 最佳答案 是的,您可以删除任何已转换为HAML的View的ERB版本。至于你的另一个问题,删除public/index/h
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie
我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe
我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.
一边学习thisRailscast我从Rack中看到了以下源代码:defself.middleware@middleware||=beginm=Hash.new{|h,k|h[k]=[]}m["deployment"].concat[[Rack::ContentLength],[Rack::Chunked],logging_middleware]m["development"].concatm["deployment"]+[[Rack::ShowExceptions],[Rack::Lint]]mendend我的问题是关于第三行。什么是传递block{|h,k|h[k]=[]}到Has
据我们所知,Jekyll默认分页仅支持index.html,我想创建blog.html并在那里包含分页。有什么解决办法吗? 最佳答案 如果您创建一个名为/blog的目录并在其中放置一个index.html文件,那么您可以向_config.yml表示paginate_path:"blog/page:num"。不是使用根文件夹中的默认index.html作为分页器模板,而是使用/blog/index.html。分页器将根据需要生成类似/blog/page2/和/blog/page3/的页面。这将使您到达yourwebsite.com/b
我正在寻找一种简单的方法来为我在RubyonRails上的项目实现简单的“即将推出”(预启动)页面。用户应该能够留下电子邮件以便在项目启动时收到通知。有没有这样的插件\gem?或者我应该自己做... 最佳答案 LaunchingSoon是一个Rails插件。它还集成了MailChimp或Campaignmonitor. 关于ruby-on-rails-RoR&&"comingsoon"页面,我们在StackOverflow上找到一个类似的问题: https:/
我想在每次访问url/code时运行一个脚本(code.rb)。如何运行脚本?require'sinatra'get'/'do#runthescriptend 最佳答案 要么fork另一个进程:system('rubycode.rb')...或者简单地将脚本加载到当前上下文中:load'code.rb'#*not*require 关于ruby-Sinatra:点击URL时运行ruby代码,我们在StackOverflow上找到一个类似的问题: https: