vue路由 遍历生成复数router-link的例子
业务场景使用vue-cli做一个spa;
需求顶部导航栏控制下方内容栏,实现页面内切换。
毫无疑问,vue-router很适合这样的需求,实现起来也并不复杂
1、main.js
import VueRouter from 'vue-router' Vue.use(VueRouter);
2、定义(路由)组件
import songList from './ponents/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: '/新歌', ponent: songList }, { path: '/排行', ponent: Bar }, { path: '/榜单', ponent: Baz }, { path: '/歌手', ponent: Fun }, { path: '', redirect: '/新歌' } ]
注意,设置了一个重定向路由,目的是当路径不属于以上任意一个时,匹配到‘新歌'页面;说白了也就是设置初始页的路由。
4、创建router实例
const router = new VueRouter({ routes//等价routes: routes })
5、创建和挂载根实例
new Vue({ router, el: '#app', render: h => h(App) })
navBar.vue
在组件页面上,按照常理应该分别写出具体数目的导航标签,类似狼蚁网站SEO优化这样
<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狼蚁网站SEO优化出现蓝色边框,
提高用户体验。那么使用.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的例子就是长沙网络推广分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持狼蚁SEO。
编程语言
- 甘肃哪有关键词排名优化购买方式有哪些
- 甘肃SEO如何做网站优化
- 河南seo关键词优化怎么做电话营销
- 北京SEO优化如何做QQ群营销
- 来宾百度关键词排名:提升您网站曝光率的关键
- 卢龙关键词优化:提升您网站排名的策略与技巧
- 山东网站优化的注意事项有哪些
- 四川整站优化怎样提升在搜索引擎中的排名
- 疏附整站优化:提升网站性能与用户体验的全新
- 海南seo主要做什么工作售后服务要做到哪些
- 荣昌百度网站优化:提升您网站的搜索引擎排名
- 河北seo网站排名关键词优化如何做SEO
- 江西优化关键词排名推广售后保障一般有哪些
- 古浪SEO优化:提升你的网站可见性
- 西藏网站排名优化怎么把网站排名在百度首页
- 如何提升阳东百度快照排名:详尽指南