Vue.js 阅读笔记(一)
系统、框架性的认识
Vue。数据绑定、计算属性、过滤器 (data、methods、computed、filter…)。
Vue.js 是什么?
简单来说,是一个数据双向绑定的渐进式前端框架。
MVVM 模式
要了解 Vue 就需要了解 MVVM 模式,它是由经典的 MVC 架构衍生来的。当 View (视图层) 变化时,会自动更新到 ViewModel (视图模型) ,反之亦然。 View 和 ViewModel 之间通过双向绑定建立联系。
实例与数据绑定
首先,通过例子简单认识
Vue的特别之处。
实例
- 数据双向绑定:
1 |
|
- 点击事件:
1 | <div id="app"> |
for:
1 | <div id="app"> |
生命周期
比较常用的生命周期钩子:
created: 实例创建完成后调用,需要初始化处理一些数据时会比较有用。
mounted: el 挂载到实例上后调用,一般我们的第一个业务处理逻辑会在这里开始。
beforeDestroy: 实例销毁之前调用。
插值与表达式
使用双大括号 实现最基本的文本插值,它会自动将我们双向绑定的数据实时显示出来。
1 | <div id="app"> |
插值表达式中的简单运算、三元运算
1 | <div id="app"> |
过滤器
在插值尾部添加管道符 | 对数据进行过滤
通过给实例添加 filters 来设置
1 | <div id="app"> |
指令与事件
指令是在
Vue中最常用的一个功能,带有前缀v-,如v-if、v-html等。
指令的主要职责就是当其表达式的值改变时,相应的将某些行为应用到 DOM 上。
数据驱动 DOM 是 Vue.js 的核心理念,所以不到万不得已时不要主动操作 DOM,只需要维护好数据,DOM 的事 Vue 会帮你优雅的处理。
v-if
对元素进行判断
1 | <div id="app"> |
v-band
绑定元素数据,用于动态更新 HTML 元素上的属性。
1 | <div id="app"> |
v-on
绑定事件监听器。
1 | <div id="app"> |
语法糖
语法糖是指在不影响功能的情况下,添加某种方法实现同样的效果,从而方便程序的开发。
在 Vue.js 中,v-bind 和 v-on 都提供了语法糖,可以缩写为 : 和 @:
1 | <div id="app"> |
语法糖可以简化代码的书写。
计算属性
模板内的表达式常用于简单的运算,当其过长或逻辑复杂时,会难以维护。计算属性就是用于解决该问题的。
1 | <div id="app"> |
计算属性的用法
1 | <div id="app"> |
例子中,商品数量或价格变化时,计算属性 prices 就会自动更新,视图中的价格也会自动变化。
每一个计算属性都包含了一个 getter 和一个 setter,上面例子是计算属性的默认用法,只是利用了 getter 来读取。
在需要时,也可以提供一个 setter 函数,当手动修改计算属性的值就像修改一个普通数据那样时,就会触发 setter 函数,执行一些自定义的操作。
1 | <div id="app"> |
绝大多数情况下,我们只会用默认的 getter 方法来读取一个计算属性,在业务中很少用到 setter,所以在声明一个计算属性时,可以直接使用默认的写法,不必将 getter 和 setter 都声明。
计算属性还有两个很实用的技巧容易被忽略,一是计算属性可以依赖其他计算属性,二是计算属性不仅可以依赖当前的 Vue 实例的数据,还可以依赖其他实例的数据。
1 | var app2 = new Vue({ |
这里的 app2 的计算属性是依赖 app1 的数据 text。
这样的用法在组件和组件化里会时常用到,尤其是在多人协同开发时。
计算属性缓存
有一个问题,你可能会发现调用 methods 里的方法也可以和计算属性达到同样的目的
1 | <div id="app"> |
既然可以使用 methods 代替,甚至还可以接受参数,使用起来更灵活,那么为什么还需要计算属性呢?原因就是计算属性是基于它的依赖缓存的。
一个计算属性所依赖的数据发生变化时,它才会重新取值,所以 text 只要不改变,计算属性也就不会更新。
但是 methods 不同,只要重新渲染,它就会被调用,因此函数也会被执行。
使用计算属性还是 methods 取决于你是否需要缓存,当遍历大数组和做大量计算时,应当使用计算属性。
v-bind class 与 style 的绑定
DOM元素经常会动态的绑定一些class类名或style样式,在vue中同样可以通过v-bind实现多种绑定的方法。
v-bind:
1 | <img v-bind:src="imgUrl"> |
可以简写为:
1 | <img :scr="imgUrl"> |
绑定 class 的几种方式
- 对象语法
给
v-band:class设置一个对象,可以动态的切换class。
1 | <div id="app"> |
渲染结果:
1 | <div class="static active"></div> |
当 :class 的表达式过长或逻辑复杂时,还可以绑定一个计算属性,这是一种很友好和常见的用法,一般当条件多于两个时,都可以使用 data 或 computed。
1 | <div id="app"> |
最终渲染结果:
1 | <div class="active text"></div> |
- 数组语法
给
:class绑定一个数组,应用一个class列表。
1 | <div id="app"> |
也可以在数组中使用对象语法:
1 | <div id="app"> |
以上两个实例的最终渲染结果都为:
1 | <div class="active error"></div> |
当然,也可以和对象语法一样,使用 data, computed, metohds 三种方法。
1 | <div id="app"> |
最终渲染结果:
1 | <button class="btn btn-large btn-disabled"></button> |
使用计算属性给元素动态设置类名,在业务中经常用到,尤其在写复用的组件时,所以在开发过程中,如果表达式较长或逻辑复杂,应该尽量的优先使用计算属性。
- 组件上的使用
如果直接在自定义组件上使用 class 或 :class,样式规则会直接应用到个组件的根元素上:
1 | Vue.component('my-component', { |
1 | <div id="app"> |
绑定内联样式
使用
:style可以给元素绑定内联样式,方法与:class类似,有对象语法和数组语法,看起来像直接在元素上写CSS。
1 | <div id="app"> |
最终渲染结果:
1 | <div style="color: red; font-size: 14px;">context</div> |
在实际业务中,:style 的数组语法并不常用,一般写在 data 和 computed 中,较为常用的应当是计算属性:
1 | <div id="app"> |
另外,使用 :style 时,Vue.js 会自动给特殊的 CSS 属性名称增加前缀,如 transform。