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

vue路由实现一个二级菜单。vue页面切换,vue子页面切换。vue菜单选中

8637人阅读 2020/6/26 17:41 总访问:5182826 评论:0 收藏:0 手机
分类: 前端

效果如下:

这种二级菜单或者三级菜单如果我们使用.net 的mvc来实现就很简单,整两个布局页可以轻松搞定来试试使用vue的路由实现其实也不难,就是一个熟练度问题。


创建一个news文件夹,然后创建一个新闻菜单下面的页面

我这里为了测试就创建两个即可

然后他们引用的组件就不在是最外层的那个Main.vue,而是News.vue,News.vue就可以理解成net mvc中的二级布局页。

  1. <template>
  2.     <NewsLayout>
  3.         <p>我是军事新闻</p>
  4.     </NewsLayout>
  5. </template>
  6. <script>
  7.     //引用News.vue组件
  8.     import NewsLayout from '../../pages/News.vue'
  9.     export default {
  10.         components: {
  11.             NewsLayout
  12.         }
  13.     }
  14. </script>

然后我们可以把各个新闻页面中不变的地方都放到News.vue中,我们这里也就是菜单嘛

  1. <template>
  2.   <Main-Layout>
  3.       <div class="submenu">
  4.         <ul>
  5.           <li><SubVLink href="/news/itnews">技术新闻</SubVLink></li>
  6.           <li><SubVLink href="/news/militarynews">军事新闻</SubVLink></li>
  7.           <li><SubVLink href="#">娱乐新闻</SubVLink></li>  
  8.         </ul>
  9.      </div>   
  10.     <div class="nwescontent">
  11.       <slot></slot>
  12.     </div> 
  13.   </Main-Layout>
  14. </template>
  15. <script>
  16. import MainLayout from "../layouts/Main.vue";
  17. //二级菜单也需要引入一下链接的组件
  18. import SubVLink from "../components/VLink.vue";
  19. export default {
  20.   components: {
  21.     MainLayout,
  22.     SubVLink
  23.   },
  24.   mounted:function(){
  25.     //alert("加载完成");
  26.   }
  27. };
  28. </script>
  29. <style scoped>
  30.   li {
  31.     display: inline;
  32.   }
  33.   a{
  34.     color: blue;
  35.   }
  36.   .submenu{
  37.     margin-left10px;
  38.   }
  39.    
  40.   .nwescontent{
  41.      margin-left60px;
  42.   }
  43. </style>

因为二级菜单也用了链接的选中效果,所以在这里也需要引入一下链接的组件


还有一点就是二级菜单中,子页面需要填充的位置也是用<slot></slot>来决定的

所以我们可以看到我们有句

  1. <div class="nwescontent">
  2.   <slot></slot>
  3. </div>

如果不写的话它是填充不到任何内容的,就相当于先在父组件挖一个坑,在由子组件去填这个坑,如果坑都没有自然也填不了。


然后把新添加的页面在routes.js中把路由配一下

  1. export default {
  2.   '/''Home',
  3.   '/about''About',
  4.   '/news''News',
  5.   //配置一下新添加页面的路由
  6.   '/news/itnews':"news/ITNews",
  7.   '/news/militarynews':"news/MilitaryNews"
  8. }

就可以实现二级菜单的切换效果了


最后说一下二级菜单的选中效果,两级菜单都变红的写法

如果那个链接组件不修改的话,他切换的时候只能一级变红,比如切换到技术新闻或军事新闻下面的时候一级菜单新闻是不会选中的。

哈哈哈,说到这里超级想用jquery来实现,因为jquery在熟悉了,实现这个功能完全是毫无压力不过居然用了vue还是用vue的思路来实现。

最开始链接组件VLink.vue中实现点击菜单变红的写法就是这样

判断一下当前路由和href属性即可。


现在我们改成如下即可同时选中满足条件的二级菜单

也就是多加了一种情况,如果是二级菜单的时候把地址栏取出来然后拆分来比较。当然这样可能不是太好理解,看看没有简写的情况

当然我觉得这样判断的写法并不友好,逻辑耦合度有点高。这里至少还有两种方案可以解决这个问题

1:在News.vue加载事件中使用vue的dom操作直接去给新闻添加一个样式(哈哈哈,典型的jquery思维)

2:重新写一个二级菜单的组件,让他们之间相互独立


好了好了,写到这里了该下班了



-----------------------------------------------2020-6-27更新-----------------------------------------------

我们把使用dom操作直接去给新闻添加一个样式这种做法说一下

要用dom操作需要在html中加一个ref属性方便我们对dom进行操作,在main.vue中添加一个ref="header"

  1. <ul ref="header">
  2.     <li>
  3.     <v-link href="/">首页</v-link>
  4.     <v-link href="/about">关于</v-link>
  5.     <v-link href="/news/itnews">新闻</v-link>
  6.     </li>
  7. </ul>

然后在添加一个选中菜单的方法choiseMenu,传递一个下标可以选择一级菜单的:

  1.   export default {
  2.     components: {
  3.       VLink
  4.     },
  5.     data() {
  6.       return {
  7.         data:"xj"
  8.       }
  9.     },
  10.     methods: {
  11.       //选中菜单的方法
  12.       choiseMenu(index) {
  13.          var aarrays = vuecontent.$refs.header.getElementsByTagName("a");
  14.          aarrays[index].className="active";
  15.       }
  16.     }
  17.   };

然后我们在二级布局页(哈哈哈.net mvc的叫法)也就是放新闻菜单的组件中加载的时候去调用一下choiseMenu这个方法即可

  1. import MainLayout from "../layouts/Main.vue";
  2. //二级菜单也需要引入一下连接的组件
  3. import SubVLink from "../components/VLink.vue";
  4. export default {
  5.   components: {
  6.     MainLayout,
  7.     SubVLink
  8.   },
  9.   //加载事件中去做一个菜单选中
  10.   mounted:function(){
  11.     // MainLayout.methods.choiseMenu();
  12.     this.$refs.myChild.choiseMenu();
  13.   }
  14. };

这里调用方法也借助了ref这个属性

当然可以使用引入组件的对象直接调用:MainLayout.methods.choiseMenu();

但是这样在main.vue的choiseMenu方法中的this就不能拿到当前的vue对象了,这样调用方法的话choiseMenu方法中的this就表示那个函数而不是vue对象了,所以我们使用ref这样的方式调用。


下面给一个demo例子,需要的可以看一下:

https://download.tnblog.net/resource/index/21ad97c6a3ac490381d52e39bdeeda39







欢迎加群讨论技术,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...