应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

vue切换菜单,vue菜单选中。跳转页面通过原生js设置选中样式。vue中使用原生js方法。js 找到当前对象的兄弟对象。js获取子节点。js获取父节点。js获取当前元素的同级节点

3784人阅读 2019/9/16 21:31 总访问:5182665 评论:0 收藏:0 手机
分类: 前端

vue切换菜单,跳转页面通过原生js设置选中样式

可以利用上面那个js获取当前元素的同级节点后先设置默认的样式,然后在设置点击这个元素的一个选中样式即可。

vue页面元素:

  1. <div class="menuwapper" >
  2. <div class="menuitem">学期报告</div>
  3. <div class="menuitem menuitemfocus" @click="jump('/user/myfeedback',$event)">我的反馈</div>
  4. <div class="menuitem">我的评估</div>
  5. <div class="menuitem" @click="jump('/user/mylabroom',$event)">我的实验</div>
  6. <div class="menuitem">我的产教</div>
  7. <div class="menuitem">我的考试</div>
  8. <div class="menuitem">个人信息</div>
  9. </div>

切换的方法:

  1. methods: {
  2. jump(path, event) {
  3. //先把元素的样式全部回归成默认状态
  4. let childNodes = event.currentTarget.parentNode.childNodes
  5. for (let index = 0; index < childNodes.length; index++) {
  6. const element = childNodes[index];
  7. element.className = "menuitem"
  8. }
  9. //给当前点击的元素添加选中样式
  10. event.currentTarget.className = "menuitem menuitemfocus"
  11. //进行页面跳转
  12. this.$router.push(path)
  13. }
  14. }

这样虽然点击的时候可以切换成功,但是在页面刚开始加载的时候是有问题的,所以需要单独处理一下刚开始加载的时候菜单选中的问题。也可以封装一个菜单选中的方法,在页面加载的时候以及页面切换的时候调用。

封装一个菜单选中的方法,在页面加载的时候以及页面切换的时候调用

  1. watch: {
  2. // 监听路由变化的时候在进行菜单选中
  3. $route(to, from) {
  4. console.log('导航页to', to)
  5. this.choiseMenu(to.fullPath)
  6. }
  7. },
  8. mounted() {
  9. const routePath = this.$route.path
  10. this.choiseMenu(routePath)
  11. },
  12. methods: {
  13. // 菜单选中,可以跳转的路由在判断应该选中的菜单
  14. choiseMenu(routePath) {
  15. const childNodes = document.getElementById('usersubmenu').getElementsByTagName('div')
  16. for (let index = 0; index < childNodes.length; index++) {
  17. const element = childNodes[index]
  18. console.log(element.getAttribute('href'))
  19. if (routePath === element.getAttribute('href')) {
  20. element.className = 'menuitem menuitemfocus'
  21. console.log('相同进来设置了')
  22. // alert('相同进来设置了' + element.getAttribute('href'))
  23. } else {
  24. element.className = 'menuitem'
  25. }
  26. }
  27. },
  28. jump(event) {
  29. const href = event.currentTarget.getAttribute('href')
  30. this.$router.push(href)
  31. }
  32. }

注意在页面切换的时候调用不是点击菜单方法跳转方法里边,如果在这个方法里边直接通过this.$route.path或者是localhost.href去获取地址,是当前这个页面的地址,而不是你想要跳转的页面地址,所以可以监听路由的方法,在这个监听方法里边去调用就行了。当然在跳转的时候调用也是可以的,只是不要去通过this.$route.path类似的方法获取当前的,而是要获取你要跳转到的目标地址,如下写法不用监听也是可以的

  1. jump(event) {
  2. const href = event.currentTarget.getAttribute('href')
  3. // 菜单选中
  4. this.choiseMenu(href)
  5. this.$router.push(href)
  6. }

还有使用这种样式绑定的方式可能还要简单一些https://www.tnblog.net/xiuxin/article/details/7959
也可以这种,绑定样式可以使用方法的形式处理,这样写逻辑更方便了,比如:class="dealChoise(item.schoolID)"

  1. <div class="shcoolItem" :class="dealChoise(item.schoolID)" @click="changeSchool(item.schoolID)"
  2. v-for="(item, index) in schoolList" v-bind:key="index">
  3. {{ item.schoolName }}</div>

处理的方法如下,达成某种条件就返回一个选中样式即可

  1. methods: {
  2. dealChoise: function (schoolID) {
  3. // 找到相同的id就给一个cur样式,达到选中的效果
  4. if (schoolID === this.$getSchoolId()) {
  5. return "cur"
  6. }
  7. }
  8. }

就上面那么一点代码就可以实现这种校区切换页面刷新之后的选中效果了

把整体页面贴一下吧

  1. <template>
  2. <div class="app-container">
  3. <div class="usercenter_left">
  4. <div class="userinfo">
  5. <div class="headimgwapper">
  6. <img
  7. class="headimg"
  8. src="https://img.tnblog.net/userdata/heads/dbc68332d521436c983fbc3adc6d9c7f.jpeg"
  9. alt=""
  10. srcset="">
  11. </div>
  12. <div style="padding:20px">
  13. <div class="sumtimes">
  14. <span
  15. style="background: #FE4444;height: 20px;width: 20px;color:#fff;display: inline-block;border-radius: 50px;line-height: 20px;text-align: center;"></span>
  16. <span>计时长:506小时46分2</span>
  17. </div>
  18. <div class="onlinetimes">
  19. <span
  20. style="background: #EA740B;height: 20px;width: 20px;color:#fff;display: inline-block;border-radius: 50px;line-height: 20px;text-align: center;"></span>
  21. <span>日时长:25小时46分50秒</span>
  22. </div>
  23. </div>
  24. </div>
  25. <div id="usersubmenu" class="menuwapper">
  26. <div class="menuitem" href="/user/index/term-report" @click="jump($event)">学期报告</div>
  27. <div class="menuitem" href="/user/index/myfeedback" @click="jump($event)">我的反馈</div>
  28. <div class="menuitem">我的评估</div>
  29. <div class="menuitem" href="/user/index/mylabroom" @click="jump($event)">我的实验</div>
  30. <div class="menuitem">我的产教</div>
  31. <div class="menuitem">我的考试</div>
  32. <div class="menuitem">个人信息</div>
  33. </div>
  34. </div>
  35. <div class="usercenter_right">
  36. <router-view />
  37. </div>
  38. </div>
  39. </template>
  40. <script>
  41. export default {
  42. data() {
  43. return {
  44. courseID: '',
  45. labId: '',
  46. chapter: {}
  47. }
  48. },
  49. watch: {
  50. // 监听路由变化的时候在进行菜单选中
  51. // $route(to, from) {
  52. // console.log('导航页to', to)
  53. // this.choiseMenu(to.fullPath)
  54. // }
  55. },
  56. mounted() {
  57. const routePath = this.$route.path
  58. this.choiseMenu(routePath)
  59. },
  60. methods: {
  61. // 菜单选中,可以跳转的路由在判断应该选中的菜单
  62. choiseMenu(routePath) {
  63. const childNodes = document.getElementById('usersubmenu').getElementsByTagName('div')
  64. for (let index = 0; index < childNodes.length; index++) {
  65. const element = childNodes[index]
  66. console.log(element.getAttribute('href'))
  67. if (routePath === element.getAttribute('href')) {
  68. element.className = 'menuitem menuitemfocus'
  69. console.log('相同进来设置了')
  70. // alert('相同进来设置了' + element.getAttribute('href'))
  71. } else {
  72. element.className = 'menuitem'
  73. }
  74. }
  75. },
  76. jump(event) {
  77. const href = event.currentTarget.getAttribute('href')
  78. // 菜单选中
  79. this.choiseMenu(href)
  80. this.$router.push(href)
  81. }
  82. }
  83. }
  84. </script>
  85. <style scoped="scoped">
  86. .app-container {
  87. width: 1200px;
  88. /* min-height: 200px; */
  89. display: flex;
  90. margin: 20px auto;
  91. }
  92. .usercenter_left {
  93. width: 235px;
  94. }
  95. .usercenter_left .userinfo {
  96. background-color: #fff;
  97. padding-top: 20px;
  98. padding-bottom: 10px;
  99. }
  100. .usercenter_left .headimgwapper {
  101. text-align: center;
  102. }
  103. .usercenter_left .headimg {
  104. width: 100px;
  105. height: 100px;
  106. border-radius: 50%;
  107. }
  108. .usercenter_left .menuwapper {
  109. min-height: 300px;
  110. margin-top: 20px;
  111. /* width: 240px; */
  112. background-color: #fff;
  113. }
  114. .usercenter_left .sumtimes {
  115. font-size: 13px;
  116. font-family: MicrosoftYaHei-, MicrosoftYaHei;
  117. font-weight: normal;
  118. color: #000000;
  119. }
  120. .usercenter_left .onlinetimes {
  121. font-size: 13px;
  122. margin-top: 10px;
  123. font-family: MicrosoftYaHei-, MicrosoftYaHei;
  124. font-weight: normal;
  125. color: #000000;
  126. }
  127. .menuwapper .menuitem {
  128. text-align: center;
  129. /* width: 66px; */
  130. height: 60px;
  131. font-size: 15px;
  132. font-family: MicrosoftYaHei-, MicrosoftYaHei;
  133. font-weight: normal;
  134. color: #747774;
  135. cursor: pointer;
  136. letter-spacing: 2px;
  137. /* line-height: 21px; */
  138. }
  139. .menuwapper .menuitem:first-child {
  140. padding-top: 34px;
  141. }
  142. .menuwapper .menuitem:hover {
  143. color: #1C6CB8;
  144. }
  145. .menuwapper .menuitemfocus {
  146. color: #1C6CB8;
  147. }
  148. .usercenter_right {
  149. flex: 1;
  150. background-color: #fff;
  151. margin-left: 20px;
  152. /* min-height: 200px; */
  153. }
  154. </style>

把这块使用到的路由配置也贴一下吧

其实这块也差不多是一个二级的布局页,下面子级,上面还有父级

  1. // 图谱
  2. const userCenter = [
  3. /**
  4. * 课程资源
  5. */
  6. {
  7. path: '/user',
  8. name: 'UserNav',
  9. component: () => import('@/pages/user-center/components/layout.vue'),
  10. redirect: '/user/major', // 设置默认打开的页面
  11. children: [
  12. {
  13. path: '/user/atlas-major',
  14. name: 'AtlasMajor',
  15. component: () => import('@/pages/user-center/atlas-major.vue'),
  16. meta: {
  17. title: '专业图谱'
  18. }
  19. },
  20. {
  21. path: '/user/atlas-growth',
  22. name: 'AtlasGrowh',
  23. component: () => import('@/pages/user-center/atlas-growth.vue'),
  24. meta: {
  25. title: '成长图谱'
  26. }
  27. },
  28. {
  29. path: '/user/index',
  30. name: 'UserIndex',
  31. component: () => import('@/pages/user-center/index.vue'),
  32. redirect: '/user/index/myfeedback', // 设置默认打开的页面
  33. meta: {
  34. title: '个人中心'
  35. },
  36. children: [
  37. {
  38. path: '/user/index/term-report',
  39. name: 'UserIndexTermReport',
  40. component: () => import('@/pages/user-center/submenu/term-report.vue'),
  41. meta: {
  42. title: '学期报告'
  43. }
  44. },
  45. {
  46. path: '/user/index/myfeedback',
  47. name: 'MyFeedback',
  48. component: () => import('@/pages/user-center/submenu/myfeedback.vue'),
  49. meta: {
  50. title: '我的反馈'
  51. }
  52. },
  53. {
  54. path: '/user/index/mylabroom',
  55. name: 'MyFeedback',
  56. component: () => import('@/pages/user-center/submenu/mylabroom.vue'),
  57. meta: {
  58. title: '我的实验'
  59. }
  60. }
  61. ]
  62. }
  63. ]
  64. }
  65. ]
  66. export default userCenter

—-

还可以参考一下这样的写法

  1. <template>
  2. <div class="common-nav">
  3. <div class="nav is-flex">
  4. <div class="nav-left">
  5. <router-link to="/" class="nav-left-a" :class="{on: isCurrent('/')}">首页
  6. </router-link>
  7. <router-link to="/article" class="nav-left-a" :class="{on: isCurrent('/article')}">文章
  8. </router-link>
  9. <router-link to="/about" class="nav-left-a" :class="{on: isCurrent('/about')}">关于
  10. </router-link>
  11. </div>
  12. </div>
  13. </div>
  14. </template>
  15. <script>
  16. export default {
  17. name: "common-nav",
  18. data() {
  19. return {}
  20. },
  21. methods: {
  22. isCurrent(path) {
  23. console.log(this.$route.path)
  24. return this.$route.path === path
  25. }
  26. }
  27. }
  28. </script>

—-

js获取子节点。js获取父节点等

  1. var chils= s.childNodes; //得到s的全部子节点。不过它会把换行和空格也当成节点信息,不推荐使用。
  2. var c = document.getElementById("price").children;//通过children来获取子节点,推荐使用
  3. const childNodes = document.getElementById('usersubmenu').getElementsByTagName('div')//根据元素获取子元素推荐使用
  4. var par=s.parentNode; //得到s的父节点
  5. var ns=s.nextSibling; //获得s的下一个兄弟节点
  6. var ps=s.previousSibling; //得到s的上一个兄弟节点
  7. var fc=s.firstChild; //获得s的第一个子节点
  8. var lc=s.lastChild; //获得s的最后一个子节点

参考:https://www.tnblog.net/notebook/article/details/7920

js获取当前元素的同级节点

先获取父级,在获取子级就可以了撒

  1. let childNodes = event.currentTarget.parentNode.childNodes

原生的JS获取ID为test的元素下的子元素。

  1. let a = docuemnt.getElementById("test").getElementsByTagName("div");

方法2:不推荐

  1. let b =document.getElementById("test").childNodes;

方法3:推荐

  1. let b =document.getElementById("test").children;

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

vue.js+Layer实现表格数据绑定与更新

一:使用Vue.js绑定好数据与更新事件 使用v-on绑定好事件,在事件里边直接把该行数据传递进去,在更新方法里边就可以直接...

vue.js 实现省市联动

HTML代码&lt;divid=&quot;pro_citys&quot;&gt; 省:&lt;selectid=&quot;provice&quot;v-on:change=&quot;prochange()&quo...

vue.js常见问题

一:花括号当做字符串显示的问题1:检查下绑定到vue.js的id是否重复,如果id重复了,就有可能存在这种问题,因为有可能把数...

vue.js常用指令

v-html可以把字符串当成一个html来渲染,而不是原样输出Html类似.net mvc中的@Html.Raw()方法&lt;divv-html=&quot;item.tit...

干货!div滚动到一定位置就固定他vue中实现一侧滚动到底部就固定

尊重原创:转载请注名出处div滚动到一定位置就固定他,例如左边的内容很多,右边的内容很少,如果不处理滚动到一定位置后右...

vue.js常用指令,事件绑定等,vue过滤器解析状态过滤器多个参数vue表格状态解析vue解析类型,element ui解析类型,状态,el-tag

按照html的编码显示:v-html&lt;div class=&quot;font_info&quot; v-html=&quot;item.Content&quot;&gt;{{item.Content}}&l...

vue.js if用法

vue.js if可以做一些判断例如我们要把下面这个输出varvm=newVue({ el:&quot;#content&quot;, data:{ titles:[&quot;小明...

vue.js 学习日记第一章-安装vue开发环境

官网:https://cn.vuejs.org/v2/guide/ 这是一篇学习性文章,不定时更新,用来记录我学习vue.js的过程。 首先,是v...

vue.js 学习日记第二章-在vue中编写function及一些简单指令

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第一章:http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第三章-vue中的简单事件及事件修饰符

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第二章:http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第四章-vue中文本框数据获取与绑定及computed计算属性

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第三章: http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第五章-v-if和v-for指令的使用方式

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第四章: http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第六章-vue组件初步学习

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第五章: http://www.tnblog.net/18323015640/article/details/2...

vue.js学习日记第七章-搭建脚手架

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第六章: http://www.tnblog.net/18323015640/article/details/2...

vue实现好友选中效果

逛过vue官网肯定会发现一个有趣的指令“v-for”,相比与以前拼接html代码确实要上档次一点,而且减少了工作量,先看一波效...

js时间格式化vue.js时间格式化,带T 时间格式化

也可以借助moment库, 参考:https://www.tnblog.net/aojiancc2/article/details/8079moment库有点大,推荐可以使用day.js...