vue-router

安装vue-router

vue-router是一个插件包,所以我们还是需要用npm来进行安装的。打开命令行工具,输入下面命令。

npm install vue-router -g   //如果在vue-cli中选择安装了就不需要执行这一步了

解读router/index.js文件

我们用vue-cli生产了我们的项目结构,你可以在src/router/index.js文件,这个文件就是路由的核心文件。

import Vue from 'vue'    //引入vue
import Router from 'vue-router'    //引入vue-router
import HelloWorld from '@/components/HelloWorld'    //引入根目录下的HelloWorld.vue组件
Vue.use(Router)    //vue全局使用Router
export default new Router({
  routes: [      //配置路由,这里是个数组
    {                      //每一个链接都是一个对象
      path: '/',       //链接路径
      name: 'HelloWorld',    //路由名称
      component: HelloWorld    //对应的组件模板
    }
  ]
})

以上路由文件中只配置了一个功能,就是进入项目时,显示HelloWorld.vue里面的代码

增加一个Hi的路由和页面

增加一个路由配置,我们希望在地址栏输入 http://localhost:8080/#/hi 的时候出现一个新的页面,效果如下。

image.png

具体的操作步骤:
1、在src/components目录下,新建 Hi.vue 文件。
编写文件内容,和我们之前讲过的一样,文件要包括三个部分<template><script>和<style>。文件很简单,只是打印一句话。

<template>
  <div>
    <h1>{{ msg }}</h1>
  </div>
</template>

<script>
export default {
  name: 'Hi',
  data () {
    return {
      msg: 'this is Hi.vue'
    }
  }
}
</script>
<style scoped>
h2 {
  color:red;
}
</style>

2、引入 Hi组件:我们在router/index.js文件的上边引入Hi组件

import Hi from '@/components/Hi'

3、增加路由配置:在router/index.js文件的routes[]数组中,新增加一个对象,代码如下。

{
      path: '/Hi',
      name: 'Hi',
      component: Hi
    }

完整router/index.js页面如下

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Hi from '@/components/Hi'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    },
    {
      path: '/Hi',
      name: 'Hi',
      component: Hi
    }
  ]
})

router-link制作导航

现在通过在地址栏改变字符串地址,已经可以实现页面内容的变化了。这并不满足需求,我们需要的是在页面上有个像样的导航链接,我们只要点击就可以实现页面内容的变化。制作链接需要<router-link>标签,我们先来看一下它的语法。

<router-link to="/">[显示字段]</router-link>

to:是我们的导航路径,要填写的是你在router/index.js文件里配置的path值,如果要导航到默认首页,只需要写成 to=”/” ,
[显示字段] :就是我们要显示给用户的导航名称,比如首页 新闻页。
明白了router-link的基本语法,我们在 src/App.vue文件中的template里加入下面代码,实现导航。

<p>导航 :
   <router-link to="/">首页</router-link>
   <router-link to="/hi">Hi页面</router-link>
</p>
image.png

vue-router配置子路由

在Hi页面的下面新建两个子页面,分别是 “Hi页面1” 和 “Hi页面2”,来实现子路由。
1、改造App.vue的导航代码
我们需要先改造app.vue的导航代码,来实现基本的导航功能。我们用<router-link>标签增加了两个新的导航链接。
App.vue代码

<p>导航 :
      <router-link to="/">首页</router-link> |
      <router-link to="/hi">Hi页面</router-link> |
      <router-link to="/hi/hi1">Hi页面1</router-link> |
      <router-link to="/hi/hi2">Hi页面2</router-link>
</p>
image.png

2、改写components/Hi.vue页面
把Hi.vue改成一个通用的模板,加入<router-view>标签,给子模板提供插入位置。“Hi页面1” 和 “Hi页面2” 都相当于“Hi页面”的子页面,有点想继承关系。我们在“Hi页面”里加入<router-view>标签。
components/Hi.vue,就是第4行的代码,其他代码不变。

<template>
  <div>
    <h1>{{ msg }}</h1>
    <router-view></router-view>
  </div>
</template>
<script>
export default {
  name: 'Hi',
  data () {
    return {
      msg: 'this is Hi.vue'
    }
  }
}
</script>
<style scoped>
h2 {
  color:red;
}
</style>

3、在components目录下新建两个组件模板 Hi1.vue 和 Hi2.vue
新建的模板和Hi.vue没有太多的差别,知识改变了data中message的值,也就是输出的结果不太一样了。
Hi1.vue

<template>
  <div>
    <h1>{{ msg }}</h1>
  </div>
</template>

<script>
export default {
  name: 'Hi1',
  data () {
    return {
      msg: 'this is Hi1.vue'
    }
  }
}
</script>
<style scoped>
h2 {
  color:red;
}
</style>

Hi2.vue

<template>
  <div>
    <h1>{{ msg }}</h1>
  </div>
</template>

<script>
export default {
  name: 'Hi2',
  data () {
    return {
      msg: 'this is Hi2.vue'
    }
  }
}
</script>
<style scoped>
h2 {
  color:red;
}
</style>

4、修改router/index.js代码
我们现在导航有了,母模板和子模板也有了,只要改变我们的路由配置文件就可以了。子路由的写法是在原有的路由配置下加入children字段。

children:[
{path:'/',name:'xxx',component:xxx},
{path:'xx',name:'xxx',component:xxx},
]

children字段后边跟的是个数组,数组里和其他配置路由基本相同,需要配置path和component(name可以省略)。具体看一下这个子路由的配置写法。

import Vue from 'vue'   
import Router from 'vue-router'  
import Hello from '@/components/Hello'  
import Hi from '@/components/Hi' 
import Hi1 from '@/components/Hi1' 
import Hi2 from '@/components/Hi2' 
 
Vue.use(Router) 
 
export default new Router({
  routes: [             
    {                    
      path: '/',        
      name: 'Hello',     
      component: Hello   
    },{
      path:'/hi',
      component:Hi,
      children:[
        {path:'/',component:Hi},
        {path:'hi1',component:Hi1},
        {path:'hi2',component:Hi2},
      ]
    }
  ]
})

注:需要注意的是,在配置路由文件前,需要先用import引入Hi1和Hi2。

vue-router如何参数传递

开发中,参数的传递是个最基本的业务需求。通过URL地址来传递参数是一个形式,vue-router为我们提供了一些传递参数的功能。我们先想象一个基本需求,就是在我们点击导航菜单时,跳转页面上能显示出当前页面的路径,来告诉用户你想在所看的页面位置(类似于面包屑导航)。

一、用name传递参数

两步完成用name传值并显示在模板里:
1、在路由文件src/router/index.js里配置name属性。

routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    }
 ]

2、模板里(src/App.vue)用$route.name的形势接收,比如直接在模板中显示:

<p>传参name:{{ $route.name}}</p>
image.png

二、通过<router-link> 标签中的to传参

也许你也会觉的用name的传参很不正规,也不方便,其实我们多数传参是不用name进行传参的,我们用<router-link>标签中的to属性进行传参,需要您注意的是这里的to要进行一个绑定,写成:to。先来看一下这种传参方法的基本语法:

<router-link :to="{name:xxx,params:{key:value}}">valueString</router-link>

这里的to前边是带冒号的,然后后边跟的是一个对象形势的字符串.

name:就是我们在路由配置文件中起的name值。
params:就是我们要传的参数,它也是对象形势,在对象里可以传递多个值。
了解基本的语法后,我们改造一下我们的src/App.vue里的<router-link>标签,我们把hi1页面的<router-link>进行修改。

<router-link :to="{name:'Hi1',params:{username:'xdj'}}">Hi页面1</router-link>

在模板里(src/components/Hi1.vue)用$route.params.username进行接收.

{{$route.params.username}}
image.png

两种传参的方法,一般会使用第二种方法。我们通过学习也知道了name的用途,一种作用是传参,一种作用是在传参时起到名称作用

单页面多路由区域操作

实际需求是这样的,在一个页面里我们有2个以上<router-view>区域,我们通过配置路由的js文件,来操作这些区域的内容。例如我们在src/App.vue里加上两个<router-view>标签。我们用vue-cli建立了新的项目,并打开了src目录下的App.vue文件,在<router-view>下面新写了两行<router-view>标签,并加入了些CSS样式。

<router-view name="left" style="float:left;width:50%;background-color:#ccc;height:300px;"></router-view>
      <router-view name="right" style="float:right;width:50%;background-color:orange;height:300px;"></router-view>

现在的页面中有了三个<router-view>标签,也就是说我们需要在路由里配置这三个区域,配置主要是在components字段里进行。

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Hi from '@/components/Hi'
import Hi1 from '@/components/Hi1'
import Hi2 from '@/components/Hi2'

Vue.use(Router)

export default new Router({
  routes: [
    {
        path:'/',
        components:{
            default:HelloWorld,
            left:Hi1,
            right:Hi2
        }
    },{
        path:'/Hi',
        components:{
            default:Hi,
            left:Hi2,
            right:Hi1
        }
    }
  ]
})

上边的代码我们编写了两个路径,一个是默认的‘/’,另一个是’/Hi’.在两个路径下的components里面,我们对三个区域都定义了显示内容。

定义好后,我们需要在component文件夹下,新建Hi1.vue和Hi2.vue页面就可以了。

Hi1.vue

<template>
  <div>
    <h1>{{ msg }}</h1>
  </div>
</template>
<script>
export default {
  name: 'Hi1',
  data () {
    return {
      msg: 'this is Hi1.vue'
    }
  }
}
</script>
<style scoped>
h2 {
  color:red;
}
</style>

Hi2.vue

<template>
  <div>
    <h1>{{ msg }}</h1>
  </div>
</template>

<script>
export default {
  name: 'Hi2',
  data () {
    return {
      msg: 'this is Hi2.vue'
    }
  }
}
</script>
<style scoped>
h2 {
  color:red;
}
</style>
image.png

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

推荐阅读更多精彩内容