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 getElementsByName()的用法说明
Jul 31 Javascript
jQuery Ajax之$.get()方法和$.post()方法
Oct 12 Javascript
jquery操作复选框checkbox的方法汇总
Feb 05 Javascript
javascript bom是什么及bom和dom的区别
Nov 26 Javascript
js添加事件的通用方法推荐
May 15 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
Oct 10 Javascript
原生javascript上传图片带进度条【实例分享】
Apr 06 Javascript
微信小程序商城项目之购物数量加减(3)
Apr 17 Javascript
jQuery自定义多选下拉框效果
Jun 19 jQuery
JS求Number类型数组中最大元素方法
Apr 08 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
Nov 12 jQuery
微信小程序上传图片并等比列压缩到指定大小的实例代码
Oct 24 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
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
详解Angualr 组件间通信
2017/01/21 Javascript
vue短信验证性能优化如何写入localstorage中
2018/04/25 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
解决Vue打包上线之后部分CSS不生效的问题
2019/11/12 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
用JavaScript实现贪吃蛇游戏
2020/10/23 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
2017/08/23 Python
django 连接数据库 sqlite的例子
2019/08/14 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
C#和SQL Server的面试题
2016/08/12 面试题
秘书岗位职责
2013/11/18 职场文书
竞聘副主任科员演讲稿
2014/01/11 职场文书
煤矿机修工岗位职责
2014/02/07 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
公司向个人借款协议书范本
2014/10/09 职场文书
实习计划书范文
2015/01/16 职场文书
科技活动总结范文
2015/05/11 职场文书
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android