vue路由 遍历生成复数router-link的例子


Posted in Javascript onOctober 30, 2019

业务场景:使用vue-cli做一个spa;

需求:顶部导航栏控制下方内容栏,实现页面内切换。

毫无疑问,vue-router很适合这样的需求,实现起来也并不复杂:

1、main.js:

import VueRouter from 'vue-router'
Vue.use(VueRouter);

2、定义(路由)组件:

import songList from './components/songList.vue'
 
const Bar = { template: '<div>no.2</div>' }
const Baz = { template: '<div>no.3</div>' }
const Fun = { template: '<div>no.4</div>' }

这里的组件也可以从外部导入,说起来应该是正确的做法,博主为了演示方便才直接写在里面了...

3、定义路由:

const routes = [
 { path: '/新歌',
 component: songList
 },
 { path: '/排行',
 component: Bar
 },
 { path: '/榜单',
 component: Baz
 },
 { path: '/歌手',
 component: Fun
 },
 { path: '*',
 redirect: '/新歌'
 }
]

注意,最后设置了一个重定向路由,目的是当路径不属于以上任意一个时,匹配到‘新歌'页面;说白了也就是设置初始页的路由。

4、创建router实例:

const router = new VueRouter({
 routes//等价routes: routes
})

5、创建和挂载根实例:

new Vue({
 router,
 el: '#app',
 render: h => h(App)
})

navBar.vue:

在组件页面上,按照常理应该分别写出具体数目的导航标签,类似下面这样:

<router-link to="/新歌">新歌</router-link>
<router-link to="/排行">排行</router-link>
<router-link to="/榜单">榜单</router-link>
<router-link to="/歌手">歌手</router-link>

但实际运用上有个小问题,就是像这样重复样式的路由入口真的有必要每个都写一遍么?唯一的区别仅仅是to属性不同?

万一今后碰到十几、二十个怎么办?

于是换个思路,尝试遍历数组来生成复数个路由入口:

<span v-for="(bar, index) in title" :key="index">
 <router-link to="">
 {{ bar }}
 </router-link>
</span>

大致如上,title是一个所有名目的数组:[ 新歌,排行,榜单,歌手,... ],Index索引用来绑定key值。现在唯一的问题 就是to也就是路由入口路径该怎么写?

由于每个都会渲染成不同出口,所以不能写成绝对路径。

方案一:将main.js中的路径都变成title中的名称,再在to中用拼接字符串实现动态匹配。

实际操作下来发现并不可取,因为在html中只会识别to=“”中双引号内的内容,更不能使用‘+'这类js才能识别的拼接符号。

方案二:使用编程式导航,

methods: {
 linkChange: function (bar) {
  this.$router.push({ path: '/'+bar});
 }
 }

<span v-for="(bar, index) in title" :key="index">
 <router-link to="" @click.native="linkChange(bar)">
 {{ bar }}
 </router-link>
</span>

这种方法将路径写在methods中就可以使用每次遍历数组获得的值,从而实现动态匹配。

为什么要给click事件加上native后缀?

这里是个很典型的router-link的小坑,因为浏览器会把router-link渲染成a标签,那么在router-link上添加的事件都会失效。

解决方案就是加上.native后缀来阻止原生事件。

但这种方式也有个很严重的BUG,即在遍历中使用编程式导航,会导致所有入口响应这个点击事件!

具体说来就是当用户点击某个路由,所有的入口都会被vue识别为选中路由,页面逻辑可能看不出来,

但只要加个.router-link-active { background: #f4f4f4 }这种vue给当前路由默认添加的class设置一个背景色,就能发现所有路由入口元素

一起变色!

这个bug在不使用遍历,依次给span设置路由的时候不会出现,具体原因希望有大神可以告知。

所以此方案也只能放弃。

方案三:

在html中绑定to属性,

<span v-for="(bar, index) in title" :key="index">
 <router-link :to="{ path: '/'+bar }">
 {{ bar }}
 </router-link>
</span>

想了太多复杂的方案,反而忽略了最基本的绑定to属性,

最方便的地方在于,大括号内既可以像我一样写完整路径,也可以直接写成:to="{ path: bar }",效果是一样的。

而且相比前面的方法,可以省去额外的点击事件,利用其本身的路径特性来完成。

到目前为止,需求可以算是基本完成,但细节还能不能更完美一点呢?

就拿这个例子来说,我们用span标签包裹了渲染成a标签的router-link,有时候我们想要选中的标签字体变成蓝色,同时span下面出现蓝色边框,

提高用户体验。那么使用.router-link-active改变a标签颜色是最方便的了,问题是上一级的span该如何添加样式呢?

似乎不添加额外class或id这种标识是无法实现功能的,但我在vue官网上看到这么一句话:“有时候我们要让 "激活时的CSS类名" 应用在外层元素,而不是 <a> 标签本身,那么可以用 <router-link> 渲染外层元素,包裹着内层的原生 <a> 标签”。

代码如下:

<router-link tag="span" :to="{ path: bar }" v-for="(bar, index) in title" :key="index">
  <a>
  {{ bar }}
  </a>
 </router-link>

使用tag标签改变其渲染元素,包裹a标签。如此一来,.router-link-active添加span底边框,.router-link-active a 来改变字体颜色。

不需要使用额外标记也能完成样式需求。

以上这篇vue路由 遍历生成复数router-link的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中yield实用简洁实现方式
Jun 12 Javascript
jQuery+css+html实现页面遮罩弹出框
Mar 21 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
Sep 22 Javascript
javascript实现Table排序的方法
May 15 Javascript
js实现新浪微博首页效果
Oct 16 Javascript
JavaScript利用正则表达式替换字符串中的内容
Dec 12 Javascript
vue实现简单表格组件实例详解
Apr 16 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
Jul 24 Javascript
详解JavaScript添加给定的标签选项
Sep 17 Javascript
解决一个微信号同时支持多个环境网页授权问题
Aug 07 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
Aug 18 Javascript
微信小程序实现聊天室
Aug 21 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
Oct 30 #Javascript
vue遍历生成的输入框 绑定及修改值示例
Oct 30 #Javascript
微信小程序基于高德地图查找位置并显示文字
Oct 30 #Javascript
vue 实现cli3.0中使用proxy进行代理转发
Oct 30 #Javascript
vue cli3 配置proxy代理无效的解决
Oct 30 #Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
Oct 30 #Javascript
vue - vue.config.js中devServer配置方式
Oct 30 #Javascript
You might like
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
php获取当前时间的毫秒数的方法
2014/01/26 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
2015/12/22 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
图片上传判断及预览脚本的效果实例
2013/08/07 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
利用python分析access日志的方法
2016/10/26 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
2017/07/05 Javascript
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
2018/01/02 Javascript
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
Python使用logging结合decorator模式实现优化日志输出的方法
2016/04/16 Python
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
解决python3 requests headers参数不能有中文的问题
2019/08/21 Python
Python中关于浮点数的冷知识
2019/09/22 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
曼联官方网上商店:Manchester United Direct
2017/07/28 全球购物
班会关于环保演讲稿
2013/12/29 职场文书
合作协议书怎么写
2014/04/18 职场文书
幼儿评语大全
2014/04/30 职场文书
酒店周年庆活动方案
2014/08/21 职场文书
环卫工作汇报材料
2014/10/28 职场文书
2016年小学生新年寄语
2015/08/18 职场文书