1. 简介
Vue.js是前端界目前非常火热的一款框架。它采用MVVM的架构模式,通过数据的绑定和响应式特性来完成数据和视图之间的同步更新,从而让前端开发更加便捷和高效。Vue Router是Vue.js官方提供的路由管理器,它可以让我们在单页应用(SPA)中实现各种复杂的路由功能,比如:嵌套路由、动态路由等等。
在本文中,我将简要介绍一下Vue Router的基本用法,然后通过一个案例来讲解如何使用Vue Router实现动态路由标签页的功能。
2. Vue Router基本用法
2.1 安装Vue Router
要使用Vue Router,我们首先需要安装它。在Vue CLI 3.x中,可以通过使用命令来快速创建一个基于Vue.js和Vue Router的项目:
// 全局安装Vue CLI 3.x
npm install -g @vue/cli
// 创建一个Vue项目,其中包含Vue Router
vue create my-project --default --plugin router
或者在项目中使用npm安装Vue Router:
npm install vue-router --save
2.2 创建路由实例
在安装好Vue Router之后,我们需要在项目中创建一个路由实例,通常情况下,我们会单独把路由相关的代码放在一个router.js文件中:
import Vue from 'vue'
import VueRouter from 'vue-router'
// 导入各个组件
import Home from './views/Home.vue'
import About from './views/About.vue'
import Contact from './views/Contact.vue'
Vue.use(VueRouter)
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About },
{ path: '/contact', component: Contact }
]
const router = new VueRouter({
mode: 'history', // 使用HTML5的History API
routes // routes: routes 的简写
})
export default router
在上面的代码中,我们首先通过Vue.use()方法安装了Vue Router,然后定义了一个名为"routes"的数组,数组中的每个对象表示一条路由规则,其中"path"表示路由的路径,"component"表示该路径对应的组件。最后,我们通过"new VueRouter()"创建了一个Vue Router实例,传入了以上的配置信息。
2.3 配置路由规则
在创建好路由实例之后,我们需要将其与Vue实例进行关联。在main.js文件中:
import Vue from 'vue'
import App from './App.vue'
import router from './router' // 导入路由实例
Vue.config.productionTip = false
new Vue({
router, // 注入路由实例
render: h => h(App),
}).$mount('#app')
其中"router"是从router.js文件中导入的Vue Router实例。然后,在App.vue组件中,我们可以使用Vue Router提供的
<template>
<div id="app">
<nav>
<router-link to="/">Home</router-link>
<router-link to="/about">About</router-link>
<router-link to="/contact">Contact</router-link>
</nav>
<router-view/>
</div>
</template>
其中,
3. 使用Vue Router实现动态路由标签页功能
3.1 功能需求
假设我们有一个博客网站,首页上展示了所有的文章列表,每篇文章都可以点击进入阅读,实现效果如下图:
![image1](https://img-blog.csdn.net/20180713201522397)
当用户点击某一篇文章的阅读时,会跳转到相应的文章页面,且在页面的顶部会自动创建一个标签,标签的标题就是文章的标题,点击标签可以回到阅读过的文章,实现效果如下图:
![image2](https://img-blog.csdn.net/20180713201740161)
我们可以在页面右上角添加一个类似于Chrome浏览器的标签页,记录用户阅读过的所有文章,并提供标签的关闭功能。可以参考如下图:
![image3](https://img-blog.csdn.net/20180713201936430)
总结一下,我们需要实现以下的功能:
点击文章进入阅读页面,页面顶部动态添加标签
点击标签回到阅读过的文章页面
在页面顶部展示标签页,方便用户查看和关闭标签
3.2 实现步骤
在上一章节中,我们已经实现了基本的Vue Router功能,接下来,我们将通过如下的步骤实现动态路由标签页:
通过Vue Router实现文章列表、文章详情和标签页的路由
在详情页中动态添加标签
展示标签页,并提供关闭标签的功能
3.3 代码实现
3.3.1 路由配置
我们需要在router.js文件中定义以下的路由规则:
import Vue from 'vue'
import VueRouter from 'vue-router'
// 导入各个组件
import Home from './views/Home.vue'
import ArticleList from './views/ArticleList.vue'
import ArticleDetail from './views/ArticleDetail.vue'
import TagList from './views/TagList.vue'
Vue.use(VueRouter)
const routes = [
{ path: '/', component: Home },
{
path: '/articles',
component: ArticleList
},
{
path: '/articles/:id',
component: ArticleDetail,
name: 'articleDetail' // 添加"name"属性
},
{
path: '/tags',
component: TagList
}
]
const router = new VueRouter({
mode: 'history',
routes
})
export default router
其中,":id"是动态路由参数,它可以匹配任意的字符串,并将其作为$route.params.id传入ArticleDetail组件中。而在ArticleDetail组件中,我们需要为其添加一个名为"name"的属性,以便在后续的代码中动态生成路由链接时使用。
3.3.2 文章详情页面
在ArticleDetail.vue组件中,我们先定义一个名为"title"的变量,保存当前文章的标题。然后,在组件的created生命周期中,使用Vue Router提供的$router.push()方法动态添加标签:
<template>
<div>
<h2>{{ title }}</h2>
<p>这里是文章的详细内容...</p>
</div>
</template>
<script>
export default {
name: 'ArticleDetail',
created () {
const { name, path, hash } = this.$route
const title = this.title // 获取文章标题
// 判断localStorage中是否有"tagList"属性,如果没有,创建一个空数组
let tagList = localStorage.getItem('tagList')
if (!tagList) {
tagList = []
} else {
tagList = JSON.parse(tagList)
}
// 判断是否已经存在相同的标签
const tag = tagList.find(item => item.path === path && item.hash === hash)
if (!tag) {
tagList.push({ name, path, hash, title }) // 添加新的标签
} else {
tag.title = title // 修改已有标签的title
}
// 将tagList存入localStorage
localStorage.setItem('tagList', JSON.stringify(tagList))
// 动态添加标签到tagNav
this.$store.commit('addTag', { name, path, hash })
}
}
</script>
在实现代码之前,我们需要在store.js文件中定义一个名为"addTag"的mutations来动态修改state.tagList数组:
export default new Vuex.Store({
state: {
tagList: []
},
mutations: {
addTag (state, tag) {
state.tagList.push(tag)
},
...
},
actions: {
...
}
})
3.3.3 标签页实现
我们需要在App.vue组件中添加一个标签页组件,并根据state.tagList数组来渲染标签页:
<template>
<div id="app">
<nav>
<router-link to="/">首页</router-link>
<router-link to="/articles">文章</router-link>
<router-link to="/tags">标签</router-link>
</nav>
<router-view/>
<tag-nav :tag-list="tagList"/>
</div>
</template>
<script>
import TagNav from './components/TagNav'
import store from './store' // 导入store
export default {
name: 'App',
computed: {
tagList () {
return store.state.tagList
}
},
components: {
TagNav
}
}
</script>
并在TagNav.vue组件中实现关闭标签的功能:
<template>
<div class="tag-nav">
<ul class="tags">
<li
v-for="(tag, index) in tagList"
:key="tag.path"
:class="{ active: tag.path === $route.path }"
>
<router-link :to="{ name: tag.name }">{{ tag.title }}</router-link>
<i
class="close"
@click.stop="closeTag(index)"
title="关闭标签"
>x</i>
</li>
</ul>
</div>
</template>
<script>
export default {
name: 'TagNav',
props: ['tagList'],
methods: {
closeTag (index) {
this.$store.commit('closeTag', index)
}
}
}
</script>
在store.js文件中,我们还需要定义一个名为"closeTag"的mutations来实现关闭标签的功能:
export default new Vuex.Store({
state: {
tagList: []
},
mutations: {
addTag (state, tag) {
state.tagList.push(tag)
},
closeTag (state, index) {
state.tagList.splice(index, 1)
}
},
actions: {
...
}
})
4. 总结
本文主要介绍了如何使用Vue Router实现动态路由标签页的功能。在实现过程中,我们需要通过Vue Router的路由功能来完成文章列表、文章详情和标签页路由的配置和跳转,通过localStorage来存储阅读过的文章,并使用Vuex状态管理来动态展示标签页和关闭标签。
Vue Router作为Vue.js官方提供的一款路由管理器,具有非常好的可扩展性和灵活性。熟练掌握Vue Router可以让我们在开发SPA应用时更加得心应手。