如何使用Vue Router实现动态路由标签页?

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>

其中,组件可以用来生成一个路由链接,"to"属性指定链接的路径。而组件则是用来渲染当前路由规则匹配到的组件。

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应用时更加得心应手。