数据与方法

  • 当一个 Vue 实例被创建时,它将 data 对象中的所有的属性加入到 Vue 的响应式系统中。data的数据和视图同步更新。
  • 实例创建后添加一个新的属性,对这个属性的的改动将不会触发任何视图的更新。
  • 如果需要一个属性,但是一开始它为空或不存在,仅需要设置一些初始值。
  • Object.freeze()方法可以阻止修改现有的属性
  • 除了数据属性,Vue 实例还包含实例属性与方法,前缀为$,例如:vm.$data,vm.$el,vm.$watch()(这里假设vm是某个实例名),详情可以参考API

实例生命周期钩子

Vue实例有自己的生命周期,提供了一些钩子函数给我们写自己的逻辑代码:

  • beforeCreate
  • created
  • beforeMount
  • mounted
  • beforeUpdate
  • updated

ps:不要在选项属性或回调上使用箭头函数,即这些钩子函数不要用箭头函数的写法,因为他们没有this

生命周期图

模板语法

  1. 文本

    数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值
    <span>Message: {{ msg }}</span>

    v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新

    <span v-once>这个将不会改变: {{ msg }}</span>
  2. 原始 HTML

    v-html 指令输出真正的html,而不是字符串
    <p>Using mustaches: {{ rawHtml }}</p> 输出字符串
    <p>Using v-html directive: <span v-html="rawHtml"></span></p> 输出rawHtml变量代表的HTML
  3. 使用 JavaScript 表达式

    所有的数据绑定,Vue.js 都提供了完全的 JavaScript 表达式支持
    {{ number + 1 }}
    
    {{ ok ? 'YES' : 'NO' }}
    
    {{ message.split('').reverse().join('') }}
    
    <div v-bind:id="'list-' + id"></div>
  4. 指令

    常见有v-if,v-on,v-bind,v-for。

    参数:
    <a v-bind:href="url">...</a>

    在这里 href 是参数,告知 v-bind 指令将该元素的 href 特性与表达式 url 的值绑定

    动态参数:

    <a v-bind:[attributeName]="url"> ... </a>

    这里的 attributeName 会被作为一个 JavaScript 表达式进行动态求值,求得的值将会作为最终的参数来使用

    修饰符:

    <form v-on:submit.prevent="onSubmit">...</form>

    修饰符 (modifier) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定,例子的.prevent就是修饰符

    缩写:

    <!-- 完整语法 -->
    <a v-bind:href="url">...</a>
    <!-- 缩写 -->
    <a :href="url">...</a>
    <!-- 完整语法 -->
    <a v-on:click="doSomething">...</a>
    <!-- 缩写 -->
    <a @click="doSomething">...</a>

计算属性和侦听器

模板一般不要加入过多的逻辑,只是用来渲染会职责分明一些,把逻辑处理防盗计算属性,会更加合理;

  <p>Computed reversed message: "{{ reversedMessage }}"</p>
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
})

这里的reversedMessage就是计算属性,可以逆序一个字符串。

定义一个方法,能够达到同样的效果:

  <p>Reversed message: "{{ reversedMessage() }}"</p>
<p>
// 在组件中
methods: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}

两者区别:计算属性是基于它们的响应式依赖进行缓存的,方法总会再次执行函数;在不同场景下选择不同的方式吧~

tips:使用计算属性,而不是侦听属性(watch里定义的方法);计算属性默认只有 getter ,不过在需要时你也可以提供一个 setter;自定义的侦听器watch在数据变化时执行异步或开销较大的操作时是最有用的

Class 与 Style 绑定

v-bind 用于 class 和 style,表达式结果的类型除了字符串之外,还可以是对象数组

先介绍Class绑定

  • 绑定对象
    <div
    class="static"
    v-bind:class="{ active: isActive, 'text-danger': hasError }">
    </div>
    data: {
    isActive: true,
    hasError: false
    }

    当 isActive 或者 hasError 变化时,class 列表将相应地更新,也可以让绑定对象不内联定义在模板里,结果也是一致的:

    <div v-bind:class="classObject"></div>
    data: {
    classObject: {
    active: true,
    'text-danger': false
    }
    }

    绑定计算属性也可以更灵活的展现(不举例子了)

  • 绑定数组
    <div v-bind:class="[activeClass, errorClass]"></div>
    data: {
    activeClass: 'active',
    errorClass: 'text-danger'
    }
  • 绑定组件(语法和前面完全类似)

Style绑定

v-bind:style 的对象语法

  • 绑定对象
    <div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
    data: {
    activeColor: 'red',
    fontSize: 30
    }

    或者直接写

    <div v-bind:style="styleObject"></div>
    data: {
    styleObject: {
    color: 'red',
    fontSize: '13px'
    }
    }
  • 绑定数组
    <div v-bind:style="[baseStyles, overridingStyles]"></div>

条件渲染

v-if、v-else-if、v-else可以配合使用:

    <div v-if="type == 'A'">
A
</div>
<div v-else-if="type == 'B'">
B
</div>
<div v-else="type == 'C'">
C
</div>
data : {
type : "B"
}

<template> 元素上使用 v-if 条件渲染分组,显示多个元素

<template v-if="ok">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>

用key管理重复元素

<template v-if="loginType === 'username'">
<label>Username</label>
<input placeholder="Enter your username" key="username-input">
</template>
<template v-else>
<label>Email</label>
<input placeholder="Enter your email address" key="email-input">
</template>

使用key标示元素后,Vue不会采用偷懒的复用,而会重新渲染元素

v-show:只有显示和不显示两种

<h1 v-show="ok">Hello!</h1>

v-if vs v-show:需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好

列表渲染

v-for用于列表渲染

  • 迭代数组
    <ul id="example-2">
    <li v-for="(item, index) in items">
    {{ parentMessage }} - {{ index }} - {{ item.message }}
    </li>
    </ul>
    var example2 = new Vue({
    el: '#example-2',
    data: {
    parentMessage: 'Parent',
    items: [
    { message: 'Foo' },
    { message: 'Bar' }
    ]
    }
    })

    ps:index从0开始,in可以替换为of,迭代插值写的是{{index}} ,不是{{item.index}}

  • 迭代对象
    <div v-for="(value, name, index) in object">
    {{ index }}. {{ name }}: {{ value }}
    </div>
    new Vue({
    el: '#v-for-object',
    data: {
    object: {
    title: 'How to do lists in Vue',
    author: 'Jane Doe',
    publishedAt: '2016-04-10'
    }
    }
    })
  • 使用唯一key配合v-for保证渲染正确(删除、排序、过滤等场景用得到)
    <div v-for="item in items" v-bind:key="item.id">
    <!-- 内容 -->
    </div>
  • 数组变异方法 (mutation method)

    push()、pop()、shift()、unshift()、splice()、sort()、reverse(),例子:
    example1.items.push({ message: 'Baz' })

    这些方法会直接改变数组本身

  • 非变异 (non-mutating method) 方法

    filter()、concat()、slice()
    example1.items = example1.items.filter(function (item) {
    return item.message.match(/Foo/)
    })

    这些方法不会改变传入的数组本身,但是方法的返回值是一个新数组,可以把这个数组赋值给原来的数组达到同样的效果

  • 注意事项

    数组的一些错误写法:
      var vm = new Vue({
    data: {
    items: ['a', 'b', 'c']
    }
    })
    vm.items[1] = 'x' // 不是响应性的
    vm.items.length = 2 // 不是响应性的

    正确写法:

    //第一个问题
    // Vue.set
    Vue.set(vm.items, indexOfItem, newValue)
    // Array.prototype.splice
    vm.items.splice(indexOfItem, 1, newValue)
    //实例写法
    vm.$set(vm.items, indexOfItem, newValue)
    //第二个问题
    vm.items.splice(newLength)

    对象的一些错误写法:

    var vm = new Vue({
    data: {
    a: 1
    }
    })
    // `vm.a` 现在是响应式的
    vm.b = 2
    // `vm.b` 不是响应式的

    对于已经创建的实例,Vue 不允许动态添加根级别的响应式属性,但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式属性:

    var vm = new Vue({
    data: {
    userProfile: {
    name: 'Anika'
    }
    }
    })
    Vue.set(vm.userProfile, 'age', 27)
    //或者
    vm.$set(vm.userProfile, 'age', 27)

表单输入绑定

v-model指令在表单 <input><textarea><select> 元素上创建双向数据绑定,本质上是语法糖。

  • 文本
    <input v-model="message" placeholder="edit me">
    <p>Message is: {{ message }}</p>
  • 多行文本
    <span>Multiline message is:</span>
    <p style="white-space: pre-line;">{{ message }}</p>
    <br>
    <textarea v-model="message" placeholder="add multiple lines"></textarea>

    tips: (<textarea>{{text}}</textarea>) 并不会生效,应用 v-model 来代替。

  • 复选框

    多个复选框,绑定到同一个数组,例子:
      <div id='example-3'>
    <input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
    <label for="jack">Jack</label>
    <input type="checkbox" id="john" value="John" v-model="checkedNames">
    <label for="john">John</label>
    <input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
    <label for="mike">Mike</label>
    <br>
    <span>Checked names: {{ checkedNames }}</span>
    </div>
    new Vue({
    el: '#example-3',
    data: {
    checkedNames: ['Jack']
    }
    })
  • 单选按钮
      <div id="example-4">
    <input type="radio" id="one" value="One" v-model="picked">
    <label for="one">One</label>
    <br>
    <input type="radio" id="two" value="Two" v-model="picked">
    <label for="two">Two</label>
    <br>
    <span>Picked: {{ picked }}</span>
    </div>
    new Vue({
    el: '#example-4',
    data: {
    picked: 'Two'
    }
    })
  • 选择框

    单选:
    <div id="example-5">
    <select v-model="selected">
    <option disabled value="">请选择</option>
    <option>A</option>
    <option>B</option>
    <option>C</option>
    </select>
    <span>Selected: {{ selected }}</span>
    </div>
    new Vue({
    el: '...',
    data: {
    selected: 'A'
    }
    })

    多选时 (绑定到一个数组):

      <div id="example-6">
    <select v-model="selected" multiple style="width: 50px;">
    <option>A</option>
    <option>B</option>
    <option>C</option>
    </select>
    <br>
    <span>Selected: {{ selected }}</span>
    </div>
      new Vue({
    el: '#example-6',
    data: {
    selected: ['A','B']
    }
    })

    v-for显示下拉框例子:

      <select v-model="selected">
    <option v-for="option in options" v-bind:value="option.value">
    {{ option.text }}
    </option>
    </select>
    <span>Selected: {{ selected }}</span>
    new Vue({
    el: '...',
    data: {
    selected: 'A',
    options: [
    { text: 'One', value: 'A' },
    { text: 'Two', value: 'B' },
    { text: 'Three', value: 'C' }
    ]
    }
    })
  • 值绑定

    单选按钮,复选框及选择框的选项,v-model 绑定的值通常是静态字符串,有时我们可能想把值绑定到 Vue 实例的一个动态属性上,这时可以用 v-bind 实现,并且这个属性的值可以不是字符串(不举例子了)
  • 修饰符
    • .lazy

      在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步,你可以添加 lazy 修饰符,从而转变为使用 change 事件进行同步
      <!-- 在“change”时而非“input”时更新 -->
    <input v-model.lazy="msg" >
    • .number

      如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符
    <input v-model.number="age" type="number">
    • .trim

      如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符:
    <input v-model.trim="msg">

从零开始的vue学习笔记(二)的更多相关文章

  1. 从零开始的vue学习笔记(一)

    前言 项目要用vue.js,今天开始自学vue.js官方教程,记录下自己的学习摘要,方便后面查阅(此笔记按照学习天数,每天一篇) Vue.js是什么 Vue是一套用于构建用户界面的渐进式框架,Vue ...

  2. vue学习笔记(二)vue的生命周期和钩子函数

    前言 通过上一章的学习,我们已经初步的了解了vue到底是什么东西,可以干什么,而这一篇博客主要介绍vue的生命周期和它常用的钩子函数,如果有学过java的园友可能有接触到在学习servlet的时候学过 ...

  3. 从零开始的vue学习笔记(八)

    前言 今天花一天时间阅读完Vue Router的官方文档的基础部分,简单的做一下总结和记录 Vue Router是什么 Vue Router 是 Vue.js 官方的路由管理器,用于构建单页应用(SP ...

  4. 从零开始的vue学习笔记(五)

    单文件组件 Vue.component 来定义全局组件的缺点: 全局定义 (Global definitions) 强制要求每个 component 中的命名不得重复 字符串模板 (String te ...

  5. Vue学习笔记二:v-cloak,v-text,v-html的使用

    目录 v-cloak:解决插值表达式闪烁问题 安装插件Live Server 右键以HTTP形式运行HTML v-text:以属性方式使用插值表达式 v-cloak和v-text的区别 v-html: ...

  6. VUE 学习笔记 二 生命周期

    1.除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法.它们都有前缀 $,以便与用户定义的属性区分开来 var data = { a: 1 } var vm = new Vue({ el: ' ...

  7. 从零开始的vue学习笔记(四)

    组件注册 组件名 Vue.component('my-component-name', { /* ... */ }) 这里的my-component-name就是组件名,组件名的取法可以参考指南 ke ...

  8. 从零开始的vue学习笔记(七)

    前言 今天花一天时间阅读完vuex的官方文档,简单的做一下总结和记录 Vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,以前的符合"单向数据流"理念的 ...

  9. 从零开始的vue学习笔记(六)

    混入 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能.简单解释就是把一个Vue组件中的内容提供给别的组件来用.例子: // 定义一个混入对象 var myMixin ...

随机推荐

  1. bzoj2049 Cave 洞穴勘测 lct

    这里比上次多了几个操作. 1. make_root(u) 换根节点, 先access(u), 再splay(u),将u移动到splay树的最顶上, 现在这棵splay对于root来说 只有左子树上有东 ...

  2. yzoj P2345 战争 题解

    纯数论 30分:纯暴力,直接模拟判断t秒后,判断hp是否小于0 60分: atk>=h,就是一炮一个,那么军队会在min(n,t)秒之后停止攻击,那么总伤害就是a[n+(n-1) +(n-2)+ ...

  3. TLS加密远程连接Docker

    <Docker远程连接设置>一文讲述了开启Docker远程连接的方法,但那种方法不安全,因为任何客户端都可以通过Docker服务的IP地址连接上去,今天我们就来学习Docker官方推荐的安 ...

  4. Linux运维基础提高之RAID卡和磁盘分区

    磁盘大小计算: 柱面的数量*每个柱面的大小(容量) [root@luffy001 ~]# fdisk -l Disk /dev/sda: 10.7 GB, 10737418240 bytes 255 ...

  5. 基于Python的多线程与多进程

    1.I/O密集型与计算密集型 多进程适用于I/O密集型 多进程适用于计算密集型 2.没有sleep(T)的多个死循环只能用多进程 3.模块介绍: 1)threading模块(_thread模块已淘汰) ...

  6. SpringCloud(三)Ribbon与Feign

    上一篇使用了Eureka与Ribbon组件做了最简单的的服务注册与发现,我们知道Eureka是实现服务治理中心的组件,但是上一篇Eureka没有实现集群,这样没有保证到Eureka Server的高可 ...

  7. spring aop 之链式调用

    关关雎鸠,在河之洲.窈窕淑女,君子好逑. 概述 AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横 ...

  8. “真”pandas“假”sql

    这篇博客利用了 pandas 对数据像 sql 一样去处理. 读取测试数据 import pandas as pd import numpy as np url = 'https://raw.gith ...

  9. Fliptile(枚举+DFS)

    Problem Description Farmer John knows that an intellectually satisfied cow is a happy cow who will g ...

  10. 过渡 - transition

    过渡 - transition 是变形transfrom其中一种效果,定义为一种状态过渡到另一种状态的过程,今天学习到css3动画,特此记录下过渡的使用和一些效果. 实例1: <div clas ...