Vue学习笔记-起步

写在最前:自学笔记,往后逐步添加笔记内容

一、通过TodoList案例起步

    

1. 模板语法

A. 插值

a. 文本内容插值
数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值:

Message: {{ msg }}

或者使用 v-text指令,绑定文本内容插值,若想插入html,可以使用 v-html 指令。
通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新。

b. 属性插值
我们通过v-bind 指令为属性赋值

对于用布尔值控制的属性而言,v-bind工作起来略有不同,他们只要存在就意味着值为true


c. JavaScript表达式

{{ number + 1 }}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}

这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。有个限制就是,每个绑定都只能包含单个表达式,所以下面的例子都不会生效。


{{ var a = 1 }}

{{ if (ok) { return message } }}
B. 指令

指令 (Directives) 是带有 v- 前缀的特殊 attribute。指令 attribute 的值预期是单个 JavaScript 表达式 (v-for 是例外情况)。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。

a. 参数
一些指令能够接收一个“参数”,在指令名称之后以冒号表示。例如,v-bind 指令可以用于响应式地更新 HTML attribute

...

另一个例子是 v-on 指令,它用于监听 DOM 事件

...

b. 动态参数
从 2.6.0 开始,可以用方括号括起来的 JavaScript 表达式作为一个指令的参数:


 ... 

这里的 attributeName 会被作为一个 JavaScript 表达式进行动态求值,求得的值将会作为最终的参数来使用。例如,如果你的 Vue 实例有一个 data 属性 attributeName,其值为 "href",那么这个绑定将等价于 v-bind:href

c. 修饰符
修饰符 (modifier) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault()

...
C. 缩写

a. v-bind 缩写


...


...


 ... 

b. v-on 缩写


...


...


 ... 

2. 计算属性

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如:

{{ message.split('').reverse().join('') }}

所以,对于任何复杂逻辑,你都应当使用计算属性

A. 基础例子

Original message: "{{ message }}"

Computed reversed message: "{{ reversedMessage }}"

//js部分 var vm = new Vue({ el: '#example', data: { message: 'Hello' }, computed: { // 计算属性的 getter reversedMessage: function () { // `this` 指向 vm 实例 return this.message.split('').reverse().join('') } } })
B. 计算属性与方法的区别

我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。相比之下计算属性更高效些。

C. 侦听器

虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

D. 计算属性的getter和setter

{{ fullName }}

//js部分 var vm = new Vue({ el: '#example', data: { firstName: 'neo', lastName: 'Wang" }, computed: { fullName: { get : function(){ return `${this.firstName} ${this.lastName}` }, set : function(value){ let arr = value.split(" "); this.firstName = arr[0]; this.lastName = arr[1]; } } } })

计算属性所依赖的值发生了变化,就会重新计算,当set计算属性的时候,get函数也会重新计算。

3. Class 与 Style 绑定

A. 绑定HTML Class

a. 对象语法
我们可以传给 v-bind:class 一个对象,以动态地切换 class:


//js部分 data: { isActive: true, hasError: false }

上面的语法表示 active 这个 class 存在与否将取决于数据属性 isActive 的 truthiness。结果渲染为:

绑定的数据对象不必内联定义在模板里:


//js部分 data: { classObject: { active: true, 'text-danger': false } }

渲染的结果和上面一样。我们也可以在这里绑定一个返回对象的计算属性

b. 数组语法
我们可以把一个数组传给 v-bind:class,以应用一个 class 列表:


//js部分 data: { activeClass: 'active', errorClass: 'text-danger' }

渲染为:

c. 用在组件上
当在一个自定义组件上使用 class 属性时,这些 class 将被添加到该组件的根元素上面。这个元素上已经存在的 class 不会被覆盖。

//组件声明
Vue.component('my-component', {
  template: '

Hi

' })

HTML 将被渲染为:

Hi

对于带数据绑定 class 也同样适用

B. 绑定内联样式

a. 对象语法
v-bind:style 的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象。CSS 属性名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用引号括起来) 来命名:


//js部分 data: { activeColor: 'red', fontSize: 30 }

同样的,对象语法常常结合返回对象的计算属性使用。

b. 数组语法
v-bind:style 的数组语法可以将多个样式对象应用到同一个元素上:

c. 自动添加加前缀
v-bind:style 使用需要添加浏览器引擎前缀的 CSS 属性时,如 transform,Vue.js 会自动侦测并添加相应的前缀。

d. 多重值
从 2.3.0 起你可以为 style 绑定中的属性提供一个包含多个值的数组,常用于提供多个带前缀的值,这样写只会渲染数组中最后一个被浏览器支持的值。在本例中,如果浏览器支持不带浏览器前缀的 flexbox,那么就只会渲染 display: flex。例如:

4. 条件渲染

A. v-if v-else v-else-if

v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 truthy 值的时候被渲染。也可以用 v-else 添加一个“else 块”,v-else-if,顾名思义,充当 v-if 的“else-if 块”,可以连续使用v-else 。元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。

Vue is awesome!

Vue is awesome!

Oh no

B. 在