vue1.0学习总结

 

前言

  使用vue已经有三、四个月了,但是只是学着使用了一些基本方法。因为现在的前端框架越来越多(Angular,React...),但是我相信万变不离其宗,很多用法框架之间还是想通的,所以借总结的vue的机会深入了解vue到每个细节,以后能更加熟练地使用vue,有机会也能在别的框架中体会相通的思想。

一、基本&&重点介绍

  • 兼容性:vue不支持IE8及以下版本,因为IE8不支持vue所使用的ECMAScript5语法
  • 数据驱动视图:不需要操作DOM
  • 支持双向绑定:但是默认为数据从父组件到子组件的单向绑定
  • 组件化:每一个用vue搭建起来的项目,其实都是一个组件树

二、数据绑定语法

  • 模板

    • Mustache 语法
    • 写法: {{}} 插文本  {{{}}}插html  
    • 可以插在属性里 eg.<div id="item-{{ id }}"></div>
  • 指令
    • 以v-为前缀,后面可以带一个参数以:连接,此外还可以带一个修饰符以.连接   eg. v-bind:href="xxx",v-on:click="onClick"
    • 缩写: v-bind:href ---> :href="xxx"    v-on:click ---> @click="xxx"

三、计算属性

  • 计算属性会有一个响应依赖,并且它会持续追踪它的响应依赖,如果响应依赖没有变化,则会返回缓存结果。只有响应依赖变化的时候才会触发视图更新。
  • 计算属性默认只是 getter,不过在需要时你也可以提供一个 setter:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// ...
computed: {
  fullName: {
    // getter
    get: function () {
      return this.firstName + ' ' this.lastName
    },
    // setter
    set: function (newValue) {
      var names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }
}
// ...

现在在调用 vm.fullName = 'John Doe' 时,setter 会被调用,vm.firstName 和 vm.lastName 也会有相应更新。  

四、Class与Style的绑定

  • class的绑定

    • 可以通过变量的布尔值,来控制class最后的渲染结果
      • eg. <div class="static" v-bind:class="{ 'class-a': isA, 'class-b': isB }"></div> ( 显示class-a或class-b是否加入到class里,取决于isA和isB的布尔值)
  • style的绑定
1
2
3
4
5
6
7
<div v-bind:style="styleObject"></div>
data: {
  styleObject: {
    color: 'red',
    fontSize: '13px'
  }
}

五、条件渲染

  • v-if: 支持使用<template></template>作为包装元素,不用直接操控元素,且最终渲染结果不会包括它(<template></template>)
  • v-show:  相当于控制display,不支持<template></template>

   注意:v-show直接用在组件上时,v-else会出现问题,可以用v-show代替v-else

1
2
<custom-component v-show="condition"></custom-component>
<p v-show="!condition">这可能也是一个组件</p>
  • v-if 和 v-show的区别: v-if 有更高的切换消耗而 v-show 有更高的初始渲染消耗。因为v-if里有数据和子组件,故操作时会不断销毁和重建,成本较高。但是v-show里的元素会被始终编译和保留

六、列表渲染

  v-for

  • 遍历数组

    • 块内特殊变量: $index (数组索引) 
    • <template></template>包装元素:适用
    • track-by: 指定数组以指定的某种顺序来渲染视图  eg.track-by="$index"
1
2
3
4
5
6
7
8
9
10
11
基本写法一:
<ul id="example-2">
  <li v-for="item in items">
    {{ parentMessage }} - {{ $index }} - {{ item.message }}
  </li>
</ul>
 
基本写法二:
<div v-for="(index, item) in items">
  {{ index }} {{ item.message }}
</div>

  

  • 遍历对象

    • 块内特殊变量:$key(对象中的key)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
new Vue({
  el: '#repeat-object',
  data: {
    object: {
      FirstName: 'John',
      LastName: 'Doe',
      Age: 30
    }
  }
})
 
基本写法一:
<ul id="repeat-object" class="demo">
  <li v-for="value in object">
    {{ $key }} : {{ value }}
  </li>
</ul>
 
基本写法二:
<div v-for="(key, val) in object">
  {{ key }} {{ val }}
</div>

  

  数组变动检测

  • 数组方法:可触发视图更新

  eg. .push()、.pop()、.shift()、.unshift()、.splice()、.sort()、.reverse() 

  • 数组的限制:

  1.不能之间用索引设置元素,eg.   vm.items[0] = {};    解决办法:使用$set方法,如 example.items.$set(0,{aaa:'changed!'}),这样就可以触发新视图了

  2.不能直接设置数组的长短, eg.   vm.items.length = 0;    解决办法:直接赋给一个空数组

  • 数组的特殊方法

  1. $set(数组索引,要修改的值)

  使用方法:如上第一点的使用方法

  2.$remove(下标)

七、方法与事件处理器

  • 事件中的特殊变量:$event
1
2
3
4
5
6
7
8
<button v-on:click="say('hello!', $event)">Submit</button>
<br>// ...
methods: {
  say: function (msg, event) {
    // 现在我们可以访问原生事件对象
    event.preventDefault()
  }
}
  • 事件修饰符: .prevent阻止默认事件  .stop阻止冒泡事件 .self只在事件发生在该元素本身(不为子元素)时触发回调  .capture添加事件监听器时
  • 按键修饰符:enter 、tab、delete、esc、space、up、down、left、right
1
<input v-on:keyup.enter="submit">

  

八、表单控件绑定

  表单控件的绑定,主要由v-model进行双向绑定

  表单

  • text/textarea: v-model 绑定的值就是text的值
  • checkbox: v-model绑定的值默认为布尔值(也可以自定义),多个checkbox绑定同一个值,对应每个checkbox的值为其value值
  • radio: v-model绑定的值为其value值,多个radio绑定同一个值,对应每个radio的值为其value值
  • select: 单选时,v-model绑定的值为option中value;多选时,要在select上加multiple

  参数特性 

  • lazy:在默认情况下,v-model 在input 事件中同步输入框值与数据,可以添加一个特性 lazy,从而改到在 change 事件中同步
  • number:自动将用户输入的转成Number
  • debounce:输入延迟

九、过渡

  动画类处理方法,跳过

十、组件

  前面提到vue的项目就是一个组件树,一个页面的所有可见的模块都可以细化成一个组件。

  想要实现一个组件主要先从初始化根实例,定义组件和注册组件

1
2
3
4
5
6
7
8
9
10
// 定义
var MyComponent = Vue.extend({
  template: '<div>A custom component!</div>'
})
// 注册
Vue.component('my-component', MyComponent)
// 创建根实例
new Vue({
  el: '#example'
})

props

  可以从父组件传给子组件的一些数据

  • 绑定修饰符:.sync 和 .once 
1
2
3
4
5
6
<!-- 默认为单向绑定 -->
<child :msg="parentMsg"></child>
<!-- 双向绑定 -->
<child :msg.sync="parentMsg"></child>
<!-- 单次绑定 -->
<child :msg.once="parentMsg"></child>
  • props中的type验证: Stirng、Number、Object、Function、Boolean、Array

父子组件通信

  • 自定义事件

    • $on() 监听事件,一般在ready时就要进行监听,不然类似$dispatch事件没办法传递数据
    • $emit()  
    • $dispatch() 派发事件,子组件派发到父组件
    • $broadcast():广播事件,父组件传递到子组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!-- 子组件模板 -->
<template id="child-template">
  <input v-model="msg">
  <button v-on:click="notify">Dispatch Event</button>
</template>
<!-- 父组件模板 -->
<div id="events-example">
  <p>Messages: {{ messages | json }}</p>
  <child></child>
</div>
 
// 注册子组件
// 将当前消息派发出去
Vue.component('child', {
  template: '#child-template',
  data: function () {
    return { msg: 'hello' }
  },
  methods: {
    notify: function () {
      if (this.msg.trim()) {
        this.$dispatch('child-msg'this.msg)
        this.msg = ''
      }
    }
  }
})<br>
// 初始化父组件
// 将收到消息时将事件推入一个数组
var parent = new Vue({
  el: '#events-example',
  data: {
    messages: []
  },
  // 在创建实例时 `events` 选项简单地调用 `$on`
  events: {
    'child-msg'function (msg) {
      // 事件回调内的 `this` 自动绑定到注册它的实例上
      this.messages.push(msg)
    }
  }
})<br><br>

  我们将这个示例分为几个步骤解读:

  1. 子组件的button元素绑定了click事件,该事件指向notify方法
  2. 子组件notify方法在处理时,调用了$dispatch,将事件派发到父组件child-msg事件,并给该该事件提供了一个msg参数
  3. 父组件的events选项中定义了child-msg事件,父组件接收到子组件的派发后,调用child-msg事件。
  • 用v-on绑定自定义事件  
1
<child v-on:child-msg="handleIt"></child>

  当子组件触发了 "child-msg" 事件,父组件的 handleIt 方法将被调用。所有影响父组件状态的代码放到父组件的 handleIt 方法中;子组件只关注触发事件。

vue1.0的更多相关文章

  1. 使用vue1.0+es6+vue-cli+webpack+iview-ui+jQuery 撸一套高质量的后台管理系统

    首先按照vue.js官网的指令安装: 1.本地安装好node.js 2.根据官方命令行工具 详情 这样一个官方的脚手架工具就已经搭建好了:但是有一点需要注意的是由于现在按照官方的搭建方法是搭建vue2 ...

  2. vue1.0和vue2.0的区别(一)

    今天我们来说一说vue1.0和vue2.0的主要变化有哪些 一.在每个组件模板,不在支持片段代码 VUE1.0是: <template> <h3>我是组件</h3> ...

  3. vue1.0和vue2.0的区别(二)

    这篇我们继续之前的vue1.0和vue2.0的区别(一)继续说 四.循环 学过vue的同学应该知道vue1.0是不能添加重复数据的,否则它会报错,想让它重复添加也不是不可以,不过需要定义别的东西 而v ...

  4. vue1.0中$index一直报错的解决办法

    原文链接:https://www.cnblogs.com/liqiong-web/p/8144925.html 看学习视频,因为年份比较早了,其实vue早已迭代到vue2.0了,遇到一些问题: v-f ...

  5. vue1.0与vue2.0对于v-for的使用的区别

    vue1.0与vue2.0对于v-for的使用的区别: 1,vue1.0中有$index,而vue2.0将$index移除. 2,vue1.0中(index,item) in list 而vue2.变 ...

  6. vue1.0+vue2.0实现选项卡

    通常我们写tab选项卡的时候,一般都是用jq等去操作dom,给同级元素移除active类,然后,给被点击元素添加active类,用vue实现也是同样的原理,都是操作active类. 我们都知道用vue ...

  7. vue使用中遇到的,以及vue1.0到vue2.0新手踩的坑

    最近再写一个vue的项目,视频中用的是vue1.0,但是现在vue已经2.0,所以踩了很多坑,先记录下来.理解有误再来修改. 路由问题 之前的路由是写在app.vue里边,而2.0的路由直接有个rou ...

  8. Vue1.0到2.0变化

    一.生命周期 二.代码片段 在vue1.0中可以在template编写时出现: <template> <div>第一行</div> <div>第二行&l ...

  9. vue的生命周期(又称钩子函数)----以及vue1.0版本与vue2.0版本生命周期的不同

    vue生命周期 1. vue1.0版本与vue2.0版本生命周期的不同 vue1.0版本生命周期图示 图1  vue1.0版本生命周期 vue1.0版本的生命周期: init 实例创建之前 creat ...

  10. vue2.x和vue1.0

    1.首先挂载方式上 在vue2.0中,如果使用body或者html作为挂载点,则会报以下警告: Do not mount Vue to <html> or <body> - m ...

随机推荐

  1. NOIP2018备考——DP专题练习

    P4095 [HEOI2013]Eden 的新背包问题   P2657 [SCOI2009]windy数   P3413 SAC#1 - 萌数   P3205 [HNOI2010]合唱队   P476 ...

  2. 解题:NOIP 2018 保卫王国

    题面 最小支配集=全集-最大独立集 所以先把点权改成正无穷/负无穷来保证强制选/不选某个点到独立集里,然后变成了洛谷的动态DP模板 GTMDNOIP2018ZTY #include<stack& ...

  3. java生成棋盘

    第一步:新建java项目,具体的命名,看下面的文件结构. 第二步:代码区 DrawChessBoard类: package com.hp.chenyanlong; import java.awt.Gr ...

  4. Kubernetes Pod详解

    目录 基本概念 pod资源配额 容器的健康检查 静态pod 基本概念 Pod是kubernetes集群中最基本的资源对象.每个pod由一个或多个业务容器和一个根容器(Pause容器)组成.Kubern ...

  5. 从url到页面加载浏览器做了什么?

    从输入url到页面加载发生了什么?1.DNS解析DNS解析是一个递归查询的过程.DNS解析的过程就是寻找哪台机器上有你需要资源的过程,当你在浏览器中输入一个地址时,www.baidu.com.其实不是 ...

  6. spring Mvc Web 编码相关 [model 到 视图传递数据] (九)

    在某种编码环境,由bean注解的参数可能会发生乱码问题. 即可页面web.xml或其他地方都设备UTF-8, 但还是会有这样的问题. 首先不要使用model传到视图的数据. 第二,不要request. ...

  7. CSS-3 RGBA的使用

    由于IE-8及以下都不支持 RGBA(),所以往往大家都不用这个属性,而是用图层叠加的方式去实现我们想要的效果.因为 opacity 这个属性是会影响到子孙元素的. 例如: <div class ...

  8. [python]python错误集锦

    ValueError: invalid literal : ''不能将非数字字符串转换为整型 object has no attribute 对象调用一个没有的方法(内建或自定义) TypeError ...

  9. CSS3 响应式布局: @media (min/max-width:***) @font-face

    响应式布局 responsive design @media 属性 bootstrap  css 分析: @media (min-width:768px){ body{***} } use @medi ...

  10. Floyd判圈算法 UVA 11549 - Calculator Conundrum

    题意:给定一个数k,每次计算k的平方,然后截取最高的n位,然后不断重复这两个步骤,问这样可以得到的最大的数是多少? Floyd判圈算法:这个算法用在循环问题中,例如这个题目中,在不断重复中,一定有一个 ...