什么是路由
  1. 后端路由: 对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器的资源;
  2. 前端路由: 对于单页面应用程序来说,主要是通过URL中的hash(#)来实现不同页面之间的跳转,同时,hash有一个特点:HTTP请求中不会包含hash相关的内容;所以,单页面程序中的页面跳转主要用hash实现;
  3. 在点页面应用程序中,这种通过hash改变来切换页面的方式,称作前端路由(区别于后端路由);
在 Vue 中使用 vue-router
  1. 导入 vue-router 组件类库
<script src="./lib/vue-router-3.1.3.js"></script>
  1. 使用 Vue.extend 创建组件
// 使用 Vue.extend 创建登录组件
var login = Vue.extend({
    template: '<h1>登录组件</h1>'
});
// 使用 Vue.extend 创建注册组件
var register = Vue.extend({
    template: '<h1>注册组件</h1>'
});
  1. 创建一个 router 实例, 通过 routers 属性来定义路由匹配规则
var router = new VueRouter({
    routers: [
        // 1, path 表示监听哪个路由链接地址
        // 2, component 表示是 如果 路由是前面匹配到的 path 则展示 component 属性对应的那个组件
        // 注意: component 必须是 组件模板对象, 不能是组件的引用名称
        { path: '/login', template: login},
        { path: '/register', template: register},
        // redirect 重定向路由默认位置
        { path: '/', redirect: '/login'}
    ]
});
  1. 使用 Vue 实例的 router 属性 来使用路由规则
var vm = new Vue({
    el: '#app',
    router: router // 使用 router 属性来使用路由规则
});
  1. 使用 router-link 组件 来导航, 使用 router-view 组件来显示匹配到的组件
<!-- 默认渲染为 a 标签 如果需要指定 使用 tag -->
<router-link to="/login" tag="span">登录</router-link>
<touter-link to="/register">注册</touter-link>
<!-- 使用 router-view 组件来显示匹配到的组件 -->
<router-view></router-view>
设置选中路由高亮的两种方式
  1. router-link 渲染出来的属性默认 带有 router-link-active 类名, 可以通过该类名设置路由样式
  2. 可以在 router 实例中 通过 linkActiveClass 属性 自定义类名 来进行全局配置
.router-link-active, myActive {
   color: 'red';
}
var router = new VueRouter({
    routers: [],
    linkActiveClass: 'myActive'
});
路由中使用动画

只需要将 Vue 中提供的 transition 标签 包裹住 router-view 标签, 在设置样式即可

.v-enter,
.v-leave-to {
  opacity: 0;
  transform: translate(80px, 0);
}
.v-enter-active,
.v-leave-active {
  transition: all 0.5s ease;
}
<transition name="" mode="out-in">
  <router-view></router-view>
</transition>
路由中传参的两种方式
<div id="app">
    <router-link to="/login/1/zs"></router-link>
    <router-link to="/register?id=1&name=zs"></router-link>
    <router-view></router-view>
</div>
var login = Vue.extend({
    // 1. 通过 params 属性来取值
    template: '<h1>login -- {{ $route.params.id }} -- {{ $route.params.name }}</h1>'
});
var register = Vue.extend({
    // 2. 通过 query 属性来取值
    template: '<h1>register -- {{ $route.query.id }} -- {{ $route.query.name }}</h1>'
});
var router = new VueRouter({
    routes: [
        { path: '/login/:id/:name', template: login },
        { path: '/register', template: register }
    ],
});
var vm = new Vue({
    el: '#app',
    router: router
});
路由的嵌套
<div id="app">
    <router-link to="/parent">Parent</router-link>
    <router-view></router-view>
</div>
<template id="tmp">
    <div>
        <h1>这是 parent 组件</h1>
        <router-link to="/parent/child1"></router-link>
        <router-link to="/parent/child2"></router-link>
        <!-- 一层萝卜一个坑??? -->
        <router-view></router-view>
    </div>
</template>
var child1 = { template: '<h3>child 1</h3>'};
var child2 = { template: '<h3>child 2</h3>'};
var parent = { template: '#tmp' };
var router = new VueRouter({
    routes: [{
        path: '/parent',
        component: parent,
        children: [
            // 注意: 以 / 开头的嵌套路径会被当做根路径, 慎用
            { path: 'child1', component: child1 },
            { path: 'child2', component: child2 }
        ]
    }]
});
var vm = new Vue({
    el: '#app',
    router: router
});
命名视图
<div id="app">
    <!-- 一个视图需要一个组件渲染, 因此同个路由多个视图,就需要多个组件 -->
    <router-view></router-view>
    <router-view name="left"></router-view>
    <router-view name="main"></router-view>
</div>
var header = { template: '<h3>header</h3>' };
var left = { template: '<h3>left</h3>' };
var main = { template: '<h3>main</h3>' };
var router = new VueRouter({
    routes: [
        { path: '/', components: { default: header, left, main }}
    ]
});
var vm = new Vue({
    router
}).$mount('#app');
watch 属性的使用

案例1: 监听 data 中属性的改变

<div id="app">
  <input type="text" v-model="firstName">
  <input type="text" v-model="lastName">
  <span>{{ fullName }}</span>
</div>
var vm = new Vue({
  data: {
    firstName: '',
    lastName: '',
    fullName: ''
  },
  watch: {
    // 接受两个参数 一个新的值, 一个更改之前的旧值
    firstName: function (newVal, oldVal) {
      this.fullName = newVal + this.lastName;
    },
    lastName: function (newVal, oldVal) {
      this.fullName = this.firstName + newVal;
    }
  }
}).$mount('#app');

案例2: 监听路由对象的改变

var vm = new Vue({
  watch: {
      '$route.path': function (newVal, oldVal) {
        if (newVal === '/login') {
          console.log('welcome to login');
        } else if (newVal === '/register') {
          console.log('welcome to register');
        }
      }
  }
}).$mount('#app');
computed 计算属性使用
var vm = new Vue({
  data: {
    firstName: '',
    lastName: '',
  },
  computed: { // 在computed中可以定义一些属性, 这些属性 叫做计算属性  本质: 一个方法, 只不过在使用的时候 是把他们的名称直接当做属性来使用的, 并不会当做方法来用
    fullName: function () {
      /**
      * 注意:
      *     1. 计算属性在引用的时候, 一定不要加 () 去调用, 直接把它当做普通的属性就好
      *     2. 只要计算属性 这个 function 内部, 所用到的任何 data 中数据发生了变化, 就会立即重新       *     计算 这个计算属性的值
      *     3. 计算属性的求值结果, 会被缓存起来, 方便下次使用; 如果计算属性方法中所有的数据没有发       *     生任何任何变化, 则不会重新计算
      */
      return this.firstName + this.lastName;
    }
  }
}).$mount('#app');
watch、computed 和 methods 之间的对比
  1. computed 属性的结果会被缓存, 除非依赖的响应式属性变化才会重新计算, 主要当做属性来使用;
  2. methods 方法表示一个具体的操作, 主要书写业务逻辑;
  3. watch 一个对象, 键是需要观察的表达式, 值是对应的回调函数, 主要用来监听某些特性数据的变化, 从而进行某些业务逻辑操作; 可以看做是 computedmethods 的结合体;

Vue 基础 day04的更多相关文章

  1. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十八║Vue基础: 指令(下)+计算属性+watch

    回顾 今天来晚辣,给公司做了一个小项目,一个瀑布流+动态视频控制的DEMO,有需要的可以联系我,公司的项目就不对外展示了(一个后端程序员真的要干前端了哈哈哈). 书接上文,昨天正式的开始了Vue的代码 ...

  2. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十九║Vue基础: 样式动态绑定+生命周期

    回顾 哈喽大家好,前后端分离系列文章又开始了,今天周一,还是感谢大家花时间来观看我写的博客,周末呢,没有写文章,但是也没有闲着,主要是研究了下遗留问题,看过之前文章的应该知道,之前的在AOP使用Red ...

  3. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十║Vue基础终篇:传值+组件+项目说明

    缘起 新的一天又开始啦,大家也应该看到我的标题了,是滴,Vue基础基本就到这里了,咱们回头看看这一路,如果你都看了,并且都会写了,那么现在你就可以自己写一个Demo了,如果再了解一点路由,ajax请求 ...

  4. python 全栈开发,Day89(sorted面试题,Pycharm配置支持vue语法,Vue基础语法,小清单练习)

    一.sorted面试题 面试题: [11, 33, 4, 2, 11, 4, 9, 2] 去重并保持原来的顺序 答案1: list1 = [11, 33, 4, 2, 11, 4, 9, 2] ret ...

  5. Vue 基础精讲

    Vue 基础精讲 Vue 官方文档:https://cn.vuejs.org/v2/guide/ VUE 实例 每个组件都是一个 vue 的实例. 一个 vue 项目是由实例组成的. vue 实例上有 ...

  6. Vue基础以及指令

    Vue 基础篇一   一.Vue框架介绍 之前大家学过HTML,CSS,JS,JQuery,Bootstrap,现在我们要学一个新的框架Vue~ Vue是一个构建数据驱动的web界面的渐进式框架. 目 ...

  7. 2-5 vue基础语法

    一.vue基础语法 语法: {{msg}} html赋值: v-html="" 绑定属性: v-bind:id="" 使用表达式: {{ok? "ye ...

  8. Vue 1-- ES6 快速入门、vue的基本语法、vue应用示例,vue基础语法

    一.ES6快速入门 let和const let ES6新增了let命令,用于声明变量.其用法类似var,但是声明的变量只在let命令所在的代码块内有效. { let x = 10; var y = 2 ...

  9. vue基础知识之vue-resource/axios

    Vue基础知识之vue-resource和axios(三)   vue-resource Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没 ...

随机推荐

  1. IP电话的配置

    内容描述:IP电话配置 问题描述: IP电话站点为8203,IP地址为10.11.6.3,电话状态为空心(不正常). 处理过程: 1.在浏览器中打开输入原先已经配置正常的IP话机的IP地址访问其配置, ...

  2. 洛谷 P2622 关灯问题II (状态压缩+BFS)

    题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...

  3. L3-006. 迎风一刀斩

    迎着一面矩形的大旗一刀斩下,如果你的刀够快的话,这笔直一刀可以切出两块多边形的残片.反过来说,如果有人拿着两块残片来吹牛,说这是自己迎风一刀斩落的,你能检查一下这是不是真的吗? 注意摆在你面前的两个多 ...

  4. pymysql基本操作

    https://www.cnblogs.com/woider/p/5926744.html https://www.runoob.com/python3/python3-mysql.html 注意: ...

  5. 数据结构--排序--快排and冒泡(python)

    听说大厂面试,限时两分钟写出来快排... 闲着没事,写了一下... def Partition(L,low,high): pivotkey = L[low] while low<high: wh ...

  6. Linux学习-NFS服务

    一.NFS服务相关介绍 1.NFS简介 NFS (Network File System) 网络文件系统,基于内核的文件系统.Sun公司开发,通过使用NFS,用户和程序可以像访问本地文件一样访问远端系 ...

  7. PHP培训教程 php生成WAP页面

    WAP(无线通讯协议)是在数字移动电话.个人手持设备(PDA等)及计算机之间进行通讯的开放性全球标准.由于静态的WAP页面在很多方面不能满足用户个性化的服务请求,因此通过WAP服务器端语言产生动态的W ...

  8. CF 480 B Long Jumps (map标记)

    题目链接:http://codeforces.com/contest/480/problem/B 题目描述:     Long Jumps   Valery is a PE teacher at a ...

  9. Internet History, Technology, and Security(week1)——History: Dawn of Electronic Computing

    前言: 第一次进行课程学习,在反复观看视频和查找字典翻译理解后选出了视频中个人认为较重要的概念,以下并不按照逐句翻译,中文概括大意余下自由发挥,对老师想要告诉我们的历史有一个初步的了解,顺便锻炼以下英 ...

  10. [BZOJ3779]重组病毒:Link-Cut Tree+线段树

    分析 其实其他的题解说的都很清楚了. 一个点出发感染到根结点所花费的时间是路径上虚边的条数+1. RELEASE相当于\(access()\). RECENTER相当于\(makeroot()\).( ...