关于vue-router的那些事儿


Posted in Javascript onMay 23, 2018

一、引子

要学习vue-router就要先知道这里的路由是什么?为什么我们不能像原来一样直接用标签编写链接哪?vue-router如何使用?常见路由操作有哪些?等等这些问题,就是本篇要探讨的主要问题

二、vue-router是什么

这里的路由并不是指我们平时所说的硬件路由器, 这里的路由就是SPA(单页应用)的路径管理器 。再通俗的说,vue-router就是WebApp的链接路径管理系统。 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统的页面应用,是用一些超链接来实现页面切换和跳转的。在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换。 路由模块的本质 就是建立起url和页面之间的映射关系 。 至于我们为啥不能用a标签,这是因为用Vue做的都是单页应用,就相当于只有一个主的index.html页面,所以你写的标签是不起作用的,你必须使用vue-router来进行管理。

三、vue-router实现原理

SPA(single page application):单一页面应用程序,只有一个完整的页面;它在加载页面时,不会加载整个页面,而是只更新某个指定的容器中内容。 单页面应用(SPA)的核心之一是: 更新视图而不重新请求页面 ;vue-router在实现单页面前端路由时,提供了两种方式:Hash模式和History模式;根据mode参数来决定采用哪一种方式。

1、Hash模式:

vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。hash(#)是URL 的锚点,代表的是网页中的一个位置,单单改变#后的部分,浏览器只会滚动到相应位置,不会重新加载网页,也就是说 #是用来指导浏览器动作的,对服务器端完全无用,HTTP请求中也不会不包括#;同时每一次改变#后的部分,都会在浏览器的访问历史中增加一个记录,使用”后退”按钮,就可以回到上一个位置;所以说 Hash模式通过锚点值的改变,根据不同的值,渲染指定DOM位置的不同数据

2、History模式:

由于hash模式会在url中自带#,如果不想要很丑的 hash,我们可以用路由的 history 模式,只需要在配置路由规则时,加入"mode: 'history'",这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。

//main.js文件中
const router = new VueRouter({
 mode: 'history',
 routes: [...]
})

当你使用 history 模式时,URL 就像正常的 url,例如 http://yoursite.com/user/id,比较好看! 不过这种模式要玩好,还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问 http://oursite.com/user/id 就会返回 404,这就不好看了。 所以呢, 你要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。

export const routes = [ 
 {path: "/", name: "homeLink", component:Home}
 {path: "/register", name: "registerLink", component: Register},
 {path: "/login", name: "loginLink", component: Login},
 {path: "*", redirect: "/"}]

此处就设置如果URL输入错误或者是URL 匹配不到任何静态资源,就自动跳到到Home页面

3、使用路由模块来实现页面跳转的方式

方式1:直接修改地址栏

方式2:this.$router.push(‘路由地址')

方式3: <router-link to="路由地址"></router-link>

四、vue-router使用方式

1:下载 npm i vue-router -S

2:在main.js中引入 import VueRouter from 'vue-router';

3:安装插件 Vue.use(VueRouter);

4:创建路由对象并配置路由规则

let router = new VueRouter({routes:[{path:'/home',component:Home}]});

5:将其路由对象传递给Vue的实例,options中加入 router:router

6:在app.vue中留坑 <router-view></router-view>

具体实现请看如下代码:

//main.js文件中引入
import Vue from 'vue';
import VueRouter from 'vue-router';
//主体
import App from './components/app.vue';
import Home from './components/home.vue'
//安装插件
Vue.use(VueRouter); //挂载属性
//创建路由对象并配置路由规则
let router = new VueRouter({
  routes: [
    //一个个对象
    { path: '/home', component: Home }
  ]
});
//new Vue 启动
new Vue({
  el: '#app',
  //让vue知道我们的路由规则
  router: router, //可以简写router
  render: c => c(App),
})

最后记得在在app.vue中“留坑”

//app.vue中
<template>
  <div>
    <!-- 留坑,非常重要 -->
    <router-view></router-view>
  </div>
</template>
<script>
  export default {
    data(){
      return {}
    }
  }
</script>

五、vue-router核心要点

1.vue-router如何参数传递

①用name传递参数

在路由文件src/router/index.js里配置name属性

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

模板里(src/App.vue)用 $router.name 来接收 比如: <p>{{ $router.name}}</p>

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

这种传参方法的基本语法:

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

比如先在src/App.vue文件中

<router-link :to="{name:'hi1',params:{username:'jspang',id:'555'}}">Hi页面1</router-link>

然后把src/router/index.js文件里给hi1配置的路由起个name,就叫hi1.

{path:'/hi1',name:'hi1',component:Hi1}

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

{{$route.params.username}}-{{$route.params.id}}

③vue-router 利用url传递参数----在配置文件里以冒号的形式设置参数。

我们在/src/router/index.js文件里配置路由

{
  path:'/params/:newsId/:newsTitle',
  component:Params
}

我们需要传递参数是新闻ID(newsId)和新闻标题(newsTitle).所以我们在路由配置文件里制定了这两个值。 在src/components目录下建立我们params.vue组件,也可以说是页面。我们在页面里输出了url传递的的新闻ID和新闻标题。

<template>
  <div>
    <h2>{{ msg }}</h2>
    <p>新闻ID:{{ $route.params.newsId}}</p>
    <p>新闻标题:{{ $route.params.newsTitle}}</p>
  </div>
</template>
<script>
export default {
 name: 'params',
 data () {
  return {
   msg: 'params page'
  }
 }
}
</script>

在App.vue文件里加入我们的 <router-view> 标签。这时候我们可以直接利用url传值了

<router-link to="/params/198/jspang website is very good">params</router-link>

2.单页面多路由区域操作

在一个页面里我们有2个以上 <router-view> 区域,我们通过配置路由的js文件,来操作这些区域的内容

①App.vue文件,在 <router-view> 下面新写了两行 <router-view> 标签,并加入了些CSS样式

<template>
 <div id="app">
  <img src="./assets/logo.png">
    <router-link :to="{name:'HelloWorld'}"><h1>H1</h1></router-link>
    <router-link :to="{name:'H1'}"><h1>H2</h1></router-link>
  <router-view></router-view>
  <router-view name="left" style="float:left;width:50%;background-color:#ccc;height:300px;"/>
  <router-view name="right" style="float:right;width:50%;background-color:yellowgreen;height:300px;"/>
 </div>
</template>

②需要在路由里配置这三个区域,配置主要是在components字段里进行

export default new Router({
  routes: [
   {
    path: '/',
    name: 'HelloWorld',
    components: {default: HelloWorld,
     left:H1,//显示H1组件内容'I am H1 page,Welcome to H1'
     right:H2//显示H2组件内容'I am H2 page,Welcome to H2'
    }
   },
   {
    path: '/h1',
    name: 'H1',
    components: {default: HelloWorld,
     left:H2,//显示H2组件内容
     right:H1//显示H1组件内容
    }
   }
  ]
 })

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

关于vue-router的那些事儿 

3.vue-router配置子路由(二级路由)

实际生活中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL中各段动态路径也按某种结构对应嵌套的各层组件,例如:

关于vue-router的那些事儿 

如何实现下图效果(H1页面和H2页面嵌套在主页中)?

关于vue-router的那些事儿 

①首先用标签增加了两个新的导航链接

<router-link :to="{name:'HelloWorld'}">主页</router-link>
<router-link :to="{name:'H1'}">H1页面</router-link>
<router-link :to="{name:'H2'}">H2页面</router-link>

②在HelloWorld.vue加入 <router-view> 标签,给子模板提供插入位置

<template>
 <div class="hello">
  <h1>{{ msg }}</h1>
  <router-view></router-view>
 </div>
</template>

③在components目录下新建两个组件模板 H1.vue 和 H2.vue 两者内容类似,以下是H1.vue页面内容:

<template>
 <div class="hello">
  <h1>{{ msg }}</h1>
 </div>
</template>
<script>
 export default {
  data() {
   return {
    msg: 'I am H1 page,Welcome to H1'
   }
  }
 }
</script>

④修改router/index.js代码,子路由的写法是在原有的路由配置下加入children字段。

routes: [
  {
   path: '/',
   name: 'HelloWorld',
   component: HelloWorld,
   children: [{path: '/h1', name: 'H1', component: H1},
    {path: '/h2', name: 'H2', component: H2}
   ]
  }
 ]

4.vue-router跳转方法

<button @click="goToMenu" class="btn btn-success">Let's order!</button>
.....
<script>
 export default{
  methods:{
   goToMenu(){
    this.$router.go(-1)//跳转到上一次浏览的页面
    this.$router.replace('/menu')//指定跳转的地址
    this.$router.replace({name:'menuLink'})// 指定跳转路由的名字下
    this.$router.push('/menu')通过push进行跳转
    this.$router.push({name:'menuLink'})通过push进行跳转路由的名字下
   }
  }
 }
</script>

5.404页面的设置

用户会经常输错页面,当用户输错页面时,我们希望给他一个友好的提示页面,这个页面就是我们常说的404页面。vue-router也为我们提供了这样的机制。 ①设置我们的路由配置文件(/src/router/index.js)

{
  path:'*',
  component:Error
}

这里的path:'*'就是输入地址不匹配时,自动显示出Error.vue的文件内容

②在/src/components/文件夹下新建一个Error.vue的文件。简单输入一些有关错误页面的内容。

<template>
  <div>
    <h2>{{ msg }}</h2>
  </div>
</template>
<script>
export default {
 data () {
  return {
   msg: 'Error:404'
  }
 }
}
</script>

此时我们随意输入一个错误的地址时,便会自动跳转到404页面

总结

以上所述是小编给大家介绍的关于vue-router的那些事儿,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
IE8 下的Js错误HTML Parsing Error...
Aug 14 Javascript
浏览器打开层自动缓慢展开收缩实例代码
Jul 04 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
Jan 09 Javascript
jquery处理json对象
Nov 03 Javascript
Vue.js 和 MVVM 的注意事项
Nov 07 Javascript
在点击div中的p时,如何阻止事件冒泡
Feb 07 Javascript
编写React组件项目实践分析
Mar 04 Javascript
JS实现对json对象排序并删除id相同项功能示例
Apr 18 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
Aug 31 Javascript
Vue的watch和computed方法的使用及区别介绍
Sep 06 Javascript
使用Layui搭建后台管理界面的操作方法
Sep 20 Javascript
ES6对象操作实例详解
May 23 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
May 23 #Javascript
详解React+Koa实现服务端渲染(SSR)
May 23 #Javascript
JavaScript+H5实现微信摇一摇功能
May 23 #Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
May 23 #Javascript
vue动态路由配置及路由传参的方式
May 23 #Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
May 23 #Javascript
深入剖析Node.js cluster模块
May 23 #Javascript
You might like
php根据年月获取当月天数及日期数组的方法
2016/11/30 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
2019/04/02 PHP
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
js实现精确到秒的倒计时效果
2016/05/29 Javascript
JavaScript闭包实例详解
2016/06/03 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
老生常谈Bootstrap媒体对象
2017/07/06 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
JavaScript实现HSL拾色器
2020/05/21 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
2020/07/27 Javascript
浅析Python中的多重继承
2015/04/28 Python
python设计模式大全
2016/06/27 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
简单了解django orm中介模型
2019/07/30 Python
英文自荐信
2013/12/15 职场文书
《草虫的村落》教学反思
2014/02/16 职场文书
销售经理竞聘书
2014/03/31 职场文书
《与朱元思书》的教学反思
2014/04/17 职场文书
小学关爱留守儿童活动方案
2014/08/25 职场文书
争做文明公民倡议书
2014/08/29 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
小班教师个人总结
2015/02/05 职场文书
学校会议通知范文
2015/04/15 职场文书
大国崛起日本观后感
2015/06/02 职场文书
博物馆观后感
2015/06/05 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python