这里说的Vue中的路由是指前端路由,与后端路由有所区别。我们可以使用url来获取服务器的资源,而这种url与资源的映射关系就是我们所说的路由。对于单页面程序来说,我们使用url时常常通过hash的方法切换页面,即我们常用的锚点。比如:

  1. <a href="#here">click me</a> /*跳转到对应的锚点*/
  2. <!-- ... -->
  3. <div id="here">you find me</div> /*设置锚点*/

而请求路径中的hash不会传到后端,所以常常被用作前端切换页面的方法,即在同一服务器资源下对页面进行切换。

下面分别从Node和Vue中使用路由,来感受具体的区别。

一、使用Node中的路由:express自带ruoter

先看一下需要完成的效果:

当我们点击页面上的Home和About按钮是会跳转到对应的服务器资源页面。

首先安装必要的模块,创建文件目录结构和前端资源文件。

  1. # 初始化目录
  2. npm init -y
  3. # 安装需要的模块
  4. npm install express art-template express-art-template

其他资源页面可以在参考这里(可直接下载运行)

二、使用Vue中的路由:VueRouter

我们使用官方路由来创建一个简单的单页面应用:

1、VueRouter的简单入门

首先我们需要安装Vue.js和VueRouter.js

  1. <script src="https://unpkg.com/vue/dist/vue.js"></script>
  2. <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
  • html代码

    1. <div id="app">
    2. <p>
    3. <router-link to="/home">Home</router-link>
    4. <router-link to="/about">About</router-link>
    5. </p>
    6. <router-view></router-view>
    7. </div>

    router-linkVueRouter提供的组件,默认会创建一个a标签,并将to属性的值作为hash值最为该链接的地址。

    router-view也是VueRouter提供的组件,用来显示路由对应的模板。

  • js代码

    1. //1、创建路由视图组件:包含了模板信息
    2. var home = {template: '<h3>This is home page!</h3>'};
    3. var about = {template: '<h3>This is about page!</h3>'};
    4. //2、创建路由规则(路由的映射关系):是一个对象数组,相当于路由映射关系表
    5. var routes = [
    6. {path: '/home', component: home},
    7. {path: '/about', component: about}
    8. ];
    9. //3、创建一个路由实例
    10. var router = new VueRouter({
    11. routes: routes
    12. });
    13. //4、将路由搭载到Vue实例中
    14. new Vue({
    15. el: '#app',
    16. router: router
    17. });

2、router-link

<router-link> 组件支持用户在具有路由功能的应用中 (点击) 导航。

通过 to 属性指定目标地址,默认渲染成带有正确链接的 <a> 标签,可以通过配置 tag 属性生成别的标签.。另外,当目标路由成功激活时,链接元素自动设置一个表示激活的 CSS 类名。

  • to(String|Location, required)

    to属性规定了链接跳转的路径,所以是必须的,可以是字符串,也可以是表示路径位置的对象。

    1. <!--将会渲染为:/home-->
    2. <router-link to="home">link</router-link>
    3. <!--也可以动态绑定-->
    4. <router-link :to="'home'"></router-link>
    5. <!--动态绑定时便可以传入对象,以下渲染为:/home?useid=123 -->
    6. <router-link :to="{path: 'home', query: {useid: '123'}}"></router-link>
  • replace

    默认为false,当设置该属性后路由不会执行router.push(),而是执行router.replace(),这样浏览器的history将不会产生导航记录。

    1. <router-link to="home" replace></router-link>
  • append

    如果设置了该属性,则连接会变成相对链接。比如从/a处点击了连接为/b的来链接,则访问的地址将变为/a/b

  • tag

    指定导航链接渲染的标签,默认为a标签。渲染为其他标签后任然会监听点击事件,具有导航效果。

  • active-class

    设置链接激活后使用的css类名,默认值为router-link-active,设置后默认值任然存在。默认值可通过路由构造选项linkActiveClass进行配置。

  • exact

    "是否激活" 默认类名的依据是 inclusive match (全包含匹配)。举个例子,如果当前的路径是 /a 开头的,那么 <router-link to="/a"> 也会被设置 CSS 类名。

  • event(String | Array< String >)

    设置激活导航的事件。默认为clcik

  • exact-active-calss

    配置当链接被精确匹配的时候应该激活的 class。默认值router-link-exact-active,该默认值也是可以通过路由构造函数选项 linkExactActiveClass 进行全局配置的。

3、router-view

<router-view> 组件是一个 functional 组件,渲染路径匹配到的视图组件。<router-view> 渲染的组件还可以内嵌自己的 <router-view>,根据嵌套路径,渲染嵌套组件。

4、路由构建选项

在创建路由是可传入的参数,上面的实例中我们传入了路由规则信息的routes,此外还有其他参数。

  • routes(Array < routeConfig >)

    routes是包含路由映射关系的数组,数组的每一项都包含了一条路由映射信息。routeConfig可以包含一些信息:

    1. declare type routeConfig = {
    2. path: string, //路径
    3. component: componentObj,//视图组件
    4. name: string,//命名路由
    5. components: {[name: string]: componentObj},//命名视图组件
    6. redirect: string | Location | Function,
    7. props: boolean | Object | Function,
    8. alias: string | Array<string>,
    9. children: Array<RouteConfig>, // 嵌套路由
    10. beforeEnter: (to: Route, from: Route, next: Function) => void,
    11. meta: any,
    12. // 2.6.0+
    13. caseSensitive: boolean,// 匹配规则是否大小写敏感?(默认值:false)
    14. pathToRegexpOptions: Object// 编译正则的选项
    15. }
  • mode

    最开始说到的前端路由和后端路由的差别,我们可以使用mode来配置路由的模式,有以下三种模式:

    • hash:浏览器模式,会在链接前加上"#"最为俩链接,支持所有浏览器。
    • history:依赖 HTML5 History API 和服务器配置。
    • abstract:支持所有 JavaScript 运行环境,如 Node.js 服务器端。
  • base

    设置路由的基路径,默认为"/"。

  • linkActiveClass

  • linkExactActiveClass

此外还有一些其他可供选择的项,这里不再一一赘述。更多细节请参考:Vue-router官方文档

5、路由实例属性

  • router.app:配置了该路由的Vue根实例。
  • router.mode:路由的模式。
  • router.currentRute:当前路由对应的路由信息对象。

6、 路由对象

一个路由对象 (route object) 表示当前激活的路由的状态信息,包含了当前 URL 解析得到的信息,还有 URL 匹配到的路由记录 (route records)

路由对象是不可变 (immutable) 的,每次成功的导航后都会产生一个新的对象。

路由对象可以出现在多个地方,自如组件内:this.$route。(注意是$route而不是$router,前者是路由对象,后者是路由实例)。

路由对象有以下属性:

  • $route.path:当前导航路径。
  • $route.params:一个 key/value 对象,包含了动态片段和全匹配片段,如果没有路由参数,就是一个空对象。
  • $route.query:一个 key/value 对象,表示 URL 查询参数。
  • $route.hash:当前路由的 hash 值 (带 #) ,如果没有 hash 值,则为空字符串。
  • $route.fullPath:完成解析后的 URL,包含查询参数和 hash 的完整路径。
  • $route.matched:一个数组,包含当前路由的所有嵌套路径片段的路由记录 。路由记录就是 routes 配置数组中的对象副本 (还有在 children 数组)。
  • $route.name:当前路由的名称,如果有的话。
  • $route.redirectedFrom:如果存在重定向,即为重定向来源的路由的名字。

更多细节请参考:Vue-router官方文档

7、一些简单的例子

#路由对象的使用
  1. <p>
  2. <!--注意:这里如果没有 / 就会变成append模式 ,即在当前连接下添加连接-->
  3. <router-link to="/query?id='123'&name='jinx'">Query</router-link>
  4. <router-link to="/params/456/yasuo">Params</router-link>
  5. </p>
  6. <router-view></router-view>
  1. //1、创建路由视图组件:在模版中掉用路由对象
  2. var query = {template: '<h3>this is query: id=<em>{{$route.query.id}}</em>&name=<em>{{$route.query.name}}</em></h3>'};
  3. var params = {template: '<h3>This is params: id=<em>{{$route.params.id}}</em>, name=<em>{{$route.params.name}}</em></h3>'};
  4. //2、创建路由规则
  5. var routes = [
  6. {path: '/query', component: query},
  7. {path: '/params/:id/:name', component: params}
  8. ];
  9. //3、创建一个路由实例
  10. var router = new VueRouter({
  11. routes: routes
  12. });
  13. //4、将路由搭载到Vue实例中
  14. new Vue({
  15. el: '#app',
  16. router: router
  17. });
#路由嵌套
  1. <div id="app">
  2. <!--路由-->
  3. <router-link to="/">Home</router-link>
  4. <router-link to="/account">Account</router-link>
  5. <router-view></router-view>
  6. <!--模板-->
  7. <script type="text/template" id="account-template">
  8. <div>
  9. <h3>用户操作界面</h3>
  10. <!--子路由-->
  11. <router-link to="/account/login">login</router-link>
  12. <router-link to="/account/register">register</router-link>
  13. <router-view></router-view>
  14. </div>
  15. </script>
  16. </div>
  1. //1、创建路由视图组件
  2. var home = {template: '<h3>home page</h3>'};
  3. var account = {template: '#account-template'};//可以导入模板(这里使用template标签的使用有bug不知道什么原因)
  4. var login = {template: '<h3>登陆</h3>'};
  5. var register = {template: '<h3>注册</h3>'};
  6. //2、创建路由规则
  7. var routes = [
  8. {path: '/', component: home},
  9. {path: '/account',
  10. component: account,
  11. children: [
  12. {path: '/account/login', component: login},
  13. {path: '/account/register', component: register}
  14. ]
  15. },
  16. ];
  17. //3、创建一个路由实例
  18. var router = new VueRouter({
  19. routes: routes
  20. });
  21. //4、将路由搭载到Vue实例中
  22. new Vue({
  23. el: '#app',
  24. router: router
  25. });

可以尝试一下如果子路由也写在外部routes的效果(当写在外部就会共用router-view标签)。关于模板需要注意的是,可以使用类似script这样的标签来包裹模板,然后根据id进行引用即可,另外,模板只能有一个根元素。关于模板标签的使用可以参考这篇文章:HTML5 template 标签元素简介

#命名视图组件

目前我们都只是用了一个router-view标签,如果我们需要使用多个,那我们就需要对组件进行命名,否则无法找到要渲染的位置。注意,使用的是conponents而非component

比如下面的例子:

  1. <div id="app">
  2. <!--对路由视图进行命名-->
  3. <router-view></router-view>
  4. <div style="display: flex;height: 800px;">
  5. <router-view name="left"></router-view>
  6. <router-view name="main"></router-view>
  7. </div>
  8. </div>
  1. //1、创建路由视图组件
  2. var header = {template: '<div class="header">header</div>'};
  3. var left = {template: '<div class="left">left</div>'};
  4. var main = {template: '<div class="main">main</div>'};
  5. //2、创建路由规则
  6. var routes = [
  7. {path: '/',
  8. components: {
  9. default: header,
  10. left: left,
  11. main: main
  12. }//命名视图组件
  13. }];
  14. //3、创建一个路由实例
  15. var router = new VueRouter({
  16. routes: routes
  17. });
  18. //4、将路由搭载到Vue实例中
  19. new Vue({
  20. el: '#app',
  21. router: router
  22. });

再添加一下样式:

  1. body{
  2. margin: 0px;
  3. padding: 0px;
  4. }
  5. .header{
  6. background-color: #6aa4d2;
  7. height: 100px;
  8. }
  9. .left{
  10. background-color: #999ddd;
  11. flex: 2;
  12. }
  13. .main{
  14. background-color: #b6b985;
  15. flex: 8;
  16. }

就可以看到以下布局效果:

Vue(day4)的更多相关文章

  1. vue day4 table

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. Vue.js - Day4

    父组件向子组件传值 组件实例定义方式,注意:一定要使用props属性来定义父组件传递过来的数据 <script>   // 创建 Vue 实例,得到 ViewModel   var vm ...

  3. Vue入门到精通

    Vue.js - Day1 课程介绍 前5天: 都在学习Vue基本的语法和概念:打包工具 Webpack , Gulp 后5天: 以项目驱动教学: 什么是Vue.js Vue.js 是目前最火的一个前 ...

  4. Vue.js 和 MVVM 小细节

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...

  5. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  6. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  7. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

  8. Vue + Webpack + Vue-loader 系列教程(2)相关配置篇

    原文地址:https://lvyongbo.gitbooks.io/vue-loader/content/ 使用预处理器 在 Webpack 中,所有的预处理器需要和一个相应的加载器一同使用.vue- ...

  9. Vue + Webpack + Vue-loader 系列教程(1)功能介绍篇

    原文地址:https://lvyongbo.gitbooks.io/vue-loader/content/ Vue-loader 是什么? vue-loader 是一个加载器,能把如下格式的 Vue ...

随机推荐

  1. 当Ucenter和应用通信失败

    http://blog.sina.com.cn/s/blog_775f158f010135uz.html 失败是常见的. 对于初次接触Ucenter的人来讲,添加一个自己的应用最头疼的就是发现通信失败 ...

  2. 16.app后端如何保证通讯安全--url签名

    app和后端的通讯过程中,api请求有可能被别人截取或不小心泄露.那么,怎么保证api请求的安全呢?在这篇文章中,介绍一种常见的保证api请求安全的做法--url签名. 1. url签名详解 在前一篇 ...

  3. 比较集合List<T>集合,前后多了哪些数据,少了哪些数据Except

    1.少了哪些数据 private List<int> GetRoleIdListReduce(List<int> roleIdListOld, List<int> ...

  4. ArcGIS API for JavaScript 入门教程[2] 授人以渔

    这篇仍然不讲怎么做,但是我要告诉你如何获取资源. 目录:https://www.cnblogs.com/onsummer/p/9080204.html 转载注明出处,博客园/CSDN/B站:秋意正寒. ...

  5. 【功耗测试环境预置自动化脚本开发】【切换wifi模式为siso模式】【用到方法*args】

    import os,reimport logginglogging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[ ...

  6. P2P综述

    原文参见:http://www.lotushy.com/?p=113 [TOC] 什么是P2P P2P全称是Peer-to-peer.P2P计算或P2P网络是一种分布式应用架构.它将任务或负载分发给P ...

  7. JDBC知识详解

    一.相关概念 1.什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它 ...

  8. object类和内部类

    1.Object object类是所有类的根类(父类). 如果一个类没有显示继承另外一个类,那么该类一定继承于object类. toString()返回对象字符串的的形式. public class ...

  9. 使用elementUI的时候,使用Upload 上传的时候,使用 list-type 属性来设置文件列表的样式,before-upload方法失效

    最近在做项目的时候,使用elementUI的时候,使用Upload 上传的时候,before-upload方法失效. 情况下:使用 list-type 属性来设置文件列表的样式. 最终的优化之后:(演 ...

  10. Python爬虫入门教程 57-100 python爬虫高级技术之验证码篇3-滑动验证码识别技术

    滑动验证码介绍 本篇博客涉及到的验证码为滑动验证码,不同于极验证,本验证码难度略低,需要的将滑块拖动到矩形区域右侧即可完成. 这类验证码不常见了,官方介绍地址为:https://promotion.a ...