vue-router学习

用vue-cli3创建vue项目,可以在创建时让脚手架安装好vue-router,但这里我不这么做,本着学习router的目的,后面一步步手动创建

起步

vue create vue-router-project

1)在components目录下删除掉Holloworld.vue组件及相关代码,新建Home.vue和About.vue组件

Home.vue

<template>
    <div>
        <h4>这是首页</h4>
    </div>
</template>

<script>
</script>

<style>
</style>

About.vue

<template>
    <div>
        <h4>这是关于</h4>
    </div>
</template>

<script>
</script>

<style>
</style>

2)在终端用命令安装router

cnpm i vue-router -s

3)在src目录下新建router目录,router目录下再创建index.js,index.js代码的配置分5步

3.1)引入vue和vue-router并把vue-router装配到vue上

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

3.2)引入Home和About组件

import Home from '../components/Home.vue'
import About from '../components/About.vue'

3.3)创建VueRouter实例

const router = new VueRouter({

})

3.4)配置路由规则,这里我们将路由规则提取到路由实例外

const  routes = [
    {
        path:'/home',
        component:Home
    },
    {
        path:'/about',
        component:About
    }
]

const router = new VueRouter({
    // 配置路由和组件间的对应关系
    routes
})

3.5)导出路由

export default

4)main.js的配置
导入路由并挂载到vue实例

image

5)在终端运行项目

npm run serve

运行结果

image

6)当我们希望首页一开始就是展开着的时, 我们可以在路由配置规则中配置redirect(重定向)

{
        path:'',
        redirect:'/home'
    }
image

可以看出我们的访问路径中含有#这个字符,这是hash模式

hash模式下的访问路径

我现在改成history模式,可以在路由实例中配置

image

这时候访问路径就变成了这样,是不是更简洁美观了


history模式

7)<router-link>标签默认是渲染成<a>标签的,我们可以让它渲染成其它标签,<router-link>中的tag属性可能实现,这里我指定它渲染成button

image

8)<router-link>标签中还有一个replace属性,加上它可以实现路径不能返回

 <router-link to='/home' replace>首页</router-link>
 <router-link to='/about' replace>关于</router-link>
image

9)当按钮被点击时,让它处于一个激活状态

9.1)<router-link>标签用来设置激活状态的默认class是.router-link-active,我们可以直接在<style>标签中加入如下代码

.router-link-active{
    color: red;
}

9.2)当我们不想使用.router-link-active这个名字时,vue-router提供了两种方式来让我们指定这个class名

我们可以用<router-link>标签提供的active-class属性来指定class名

 <router-link to='/home' replace tag="button" active-class="active">首页</router-link>
 <router-link to='/about' replace tag="button" active-class="active">关于</router-link>

或在index.js中router实例中用linkActiveClass这个属性指定class名

linkActiveClass:'active'

在<style>中的代码

.active{
    color: red;
}

效果

image

10)我们并不是只能通过<router-link>标签来实现点击跳转,我们还可以这么实现

<button @click="goHome">首页</button>
<button @click="goAbout">关于</button>

在<script>标签的export default中加入

  methods:{
      goHome(){
          // this.$router.replace('/home')
          this.$router.push('/home')
          console.log("跳转到home")
      },
      goAbout(){
          // this.$router.replace('/about')
          this.$router.push('/about')
          console.log("跳转到about")
      }
  }

vue-router当中有$router这个属性,每个组件当中都可以直接拿来用

image

动态路由

1)首先在components目录下创建User.vue组件

<template>
    <div>
        <h4>这是用户组件----{{$route.params.userId}}</h4>
    </div>
</template>

<script>
</script>

<style>
</style>

这里另一个重要的vue-router属性是$route,,我们可以用$route.params. ** 取出传递过来的参数
2)在index.js中引入user组件

import User from '../components/User.vue'

路由配置规则中配置如下动态路由

{
    path:'/user/:userId',
    component:User
}
image

在App.vue组件中的<script>标签中的export default 中定义userId变量

  data(){
      return {
          userId:12345
      }
  }

在的模板中添加

  <router-link :to='/user/+userId' replace tag="button">用户</router-link>

运行结果

image

路由懒加载

在index.js文件中把

import Home from '../components/Home.vue'

换成

const Home= ()=>import('../components/Home.vue')

就可以实现路由懒加载

image

子路由

1)在components目录下创建一个名为children的子目录,用来存放名为HomeMessage.vue和HomeNews.vue的子组件
HomeMessage.vue

<template>
    <h2>这是HomeMessage组件</h2>
</template>

<script>
</script>

<style>
</style>

HomeNews.vue

<template>
    <h2>这是HomeNews组件</h2>
</template>

<script>
</script>

<style>
</style>

2)打开index.js

2.1)导入子组件

const News= ()=>import('../components/children/HomeNews.vue')
const Message= ()=>import('../components/children/HomeMessage.vue')

2.2)在路由配置规则里给home路由配置子路由规则

children:[
   {path:'',redirect:'news'},
   {path:'news',component:News},
   {path:'message',component:Message}
]
image

3)在Home.vue组件中添加展现路由的视图

<router-link to="/home/news">新闻</router-link>
<router-link to="/home/message">消息</router-link>
<router-view></router-view>
image

运行结果


image

传递参数

路由传递参数的方式有两种,一种是上面说过的动态路由,现在来学习第二种方式
1)在components目录中新建Profile.vue组件

<template>
    <div>
        <h2>这是Profile组件</h2>
    </div>
</template>

<script>
</script>

<style>
</style>

2)在index.js中导入组件并配置路由规则

const Profile = ()=>import('../components/Profile.vue')
{
path:'/profile',
component:Profile
}

3)在App.vue中添加代码

<router-link :to="{path:'/profile',query:{name:'jing',age:22}}" replace tag="button">档案</router-link>

4)再回到Profile.vue中添加接收路由传递过来的数据的代码

<h2>{{$route.query.name}}</h2>
<h2>{{$route.query.age}}</h2>

运行结果

image

导航守卫

我们现在用全局前置守卫来切换网页的title

image

在路由配置规则中给各个路由添加meta属性

meta:{
title:'首页'
}
image

然后使用 router.beforeEach 注册一个全局前置守卫

router.beforeEach((to,from,next) => {
    document.title = to.matched[0].meta.title
    next()
})

运行结果

image

修改配置

修改cli3创建的项目的配置有两种方式

1)在node_modules目录的如下目录中直接修改

image
image

2)在项目的根目录下创建一个名为vue.config.js的文件,这里进行简单的配置

module.exports = {
    devServer:{
        // 运行时自动打开浏览器
        open:true
    }
}

至此,本学习项目的最终目录结构如下

image

Vue Router官网

个人网站:www.panbingwen.cn

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • 学习目的 学习Vue的必备技能,必须 熟练使用 Vue-router,能够在实际项目中运用。 Vue-rout...
    _1633_阅读 92,024评论 3 58
  • 那这次呢?我决定直接就先放一个小小demo上来 其实我们在引入vue-router插件那一刻,我们的网页就已经附带...
    看物看雾阅读 815评论 0 1
  • 一、Vue-router之集成 1. 功能 处理前端路由的功能 2. 安装 npm install vue-rou...
    六寸光阴丶阅读 2,528评论 0 0
  • 我们在构建复杂系统的时候,需要构建多页面来完成不同的功能,在使用多个页面的时候,用层级路径来标示页面。vue ro...
    saidev阅读 372评论 0 0
  • vue-router学习笔记 安装 并且如果在一个模块化工程中使用它,必须要通过Vue.use()明确地安装路由功...
    EL_PSY_CONGROO阅读 579评论 0 0