Vue.js 生命周期、计算属性及侦听器
一、创建一个Vue实例
每个Vue应用都是使用Vue函数创建一个Vue实例。所有的Vue组件都是一个Vue实例,并且接受相同的选项对象(一些根实例特有的选项除外)。
数据和方法
当一个实例被创建后,它向Vue的响应式系统加入了其data对象中能找到的所有属性。当这些属性的值改变的时候,视图也会跟着响应。
注意:
1.值得注意的是,只有当Vue实例被创建的时候的data对象中的存在的属性才是响应式的。
2.如果你知道你会在晚些时候需要一个属性,但是一开始它为空或者不存在,那么你仅需要设置一些初始值。
3.这里唯一的例外是使用object.freeze(),这会阻止修改现有的属性。
4.当然除了数据属性,Vue实例还暴露出了一些实例属性和方法,它们都有前缀$,这样便于和用户自定义的属性区分开来。
二、实例生命周期钩子
每个Vue实例在被创建时都要经过一系列的初始化过程,例如,需要设置数据监听,编译模板,将实例挂载到DOM并且在数据变化时更新DOM。同时在这个
过程中会运行一些叫生命周期钩子的函数。生命周期钩子的this上下文指向调用它的实例
- 初始化事件和生命周期
- beforeCreate: 这时候访问不到数据和真实DOM
- beforeCreate和created之间的时间,挂载数据和绑定事件
- created:用于在一个实例被创建之后执行的代码。倒数第二次机会更改数据,更改数据之后不会触发updated钩子函数
created和beforeMount之间,会寻找实例或组件是否有模板(template),编译模板为虚拟DOM放到render函数中渲染。 - beforeMount:这是倒数第一次机会更改数据。更改数据之后不会触发updated钩子函数
- mounted: 这时候可以访问到真实的DOM
- beforeUpdate:当实例或组件的数据变化的时候,这时候会立即调用beforeUpdate钩子函数,然后Vue的虚拟DOM机制会重新创建dom树,和之前的dom树进行比较,利用diff算法
- updated:
- beforeDestroy:在这里可以清除定时器,清除事件绑定
- destroyed:在这里也可以做类似清除定时器的事情
所有生命周期方法被调用的时候,this都指向所在的Vue实例。
实际的生命周期方法调用次序:
1.new Vue();
2.在进行create之前,需要调用beforeCreate生命周期钩子;
3.然后挂载数据,绑定事件;
4.然后调用created生命周期方法;
5.判断是否有el的选项,如果有,再判断其是否有template选项;如果没有的话,就在vm.$mount(el)被called的时候,再去判断其是否有template的选项。
6.这时候判断有无template选项,如果有的话,就看他将template模板变成render function,
7.在mount之前,还要调用beforeMount,执行完beforeMount之后,就将el渲染成vm.$el。然后调用mounted。
8.渲染完之后,如果数据有变化的话,就需要重新渲染,然后就调用beforeUpdate,虚拟DOM重新渲染并更新。更新完之后调用updated;
9.如果页面即将被销毁的时候,先调用beforeDestroy,然后等销毁完之后,就调用destroyed。
三、计算属性和侦听器
1.计算属性
var vm = new Vue({
el: '#example',
data:{
message: 'hello'
},
computed:{
//reverseMessage是计算属性,因为其依赖了message数据属性,当message变化的时候,reverseMessage也跟着改变
reverseMessage: function(){
return this.message.split("").reverse().join("");
},
//now也是计算属性,但是它并不是响应式依赖,计算属性是基于它们的依赖来缓存
now: function(){
return Date.now();
}
}
methods:{
reverseMessage:function(){
return this.message.split("").reverse().join("");
}
}
})
计算属性缓存vs方法
(1)计算属性是基于响应式依赖进行缓存的。一个计算属性B依赖于某个属性A,如果这个属性A是依赖于遍历一个比较大的数组进行缓存的。这时候使用计算属性可以降低遍历大数组的开销。
如果使用方法的话,则这个计算属性B则每次根据A进行计算,而每次A要根据大数组来计算,这时候就会每次获取属性B,都会遍历一次大数组。
2.侦听属性
var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar',
fullName: 'Foo Bar'
},
watch: {
firstName: function (val) {
this.fullName = val + ' ' + this.lastName
},
lastName: function (val) {
this.fullName = this.firstName + ' ' + val
}
}
})
看起来计算属性要比侦听属性好用得多,侦听属性看起来滥用watch。
3.计算属性的setter
计算属性默认只有getter,不过在需要的时候,也提供一个setter。
computed:{
reverseMessage: function(){
return this.message.split("").reverse().join("");
},
now: function(){
return Date.now();
},
fullName:{
get: function(){
return this.firstName + this.lastName;
},
set:function(newValue){
var names = newValue.split(" ");
this.firstName = names[0];
this.lastName = names[names.length - 1]
}
}
}
4.侦听器
虽然计算属性在大多数情况下合适,但也需要一个自定义的侦听器。Vue通过watch选项,提供一个更通用的方法,来响应数据的变化。
当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。
四、class与style绑定
在将v-bind用于class和style的时候,表达式结果的类型除了字符串,因为字符串拼接比较繁琐,Vue对其进行增强,还可以是对象和数组。
1、对象语法
data: {
isActive: true,
hasError: false
}
// 单个属性
<div class="color" v-bind:class="{active: isActive}" >fff</div>
<div class="color active"></div>
// 多个属性
<div v-bind:class="{active: isActive,'text-danger': hasError}"></div>
<div class="active"></div>
// 直接通过classObj计算属性来
<div v-bind:class="classObj"></div>
<div class="active"></div>
{
data: {
isActive: true,
hasError: false
},
computed: {
classObj: function() {
return {
active: isActive && !hasError,
text-danger: hasError
}
}
}
}
2、数组
// 单纯使用数组中的值
<div v-bind:class="[activeClass,dangerClass]"></div>
<div class="active text-danger"></div>
data:{
activeClass: 'active',
dangerClass: 'text-danger',
}
// 数组中运用三元表达式
<div v-bind:class="[isActive?activeClass : '', dangerClass]"></div>
<div class="active text-danger"></div>
data:{
isActive: true,
activeClass: 'active',
dangerClass: 'text-danger'
}
// 数组中也可以使用对象
<div v-bind:class="[{active: isActive}, dangerClass]"></div>
<div class="active text-danger"></div>
data:{
isActive: true,
dangerClass: 'text-danger'
}
Vue.js 生命周期、计算属性及侦听器的更多相关文章
- vue 自学笔记(三) 计算属性与侦听器
一:计算属性 虽然在模板内使用表达式对属性进行处理十分便利,例如在小胡子语法里写number + 1实现对数据的简单处理,但若我们在其中加入大量的代码,使得逻辑变重,导致难以维护.例如下面的代码,并不 ...
- vue入门:(计算属性和侦听器)
methods watch computed 一.methods-方法 在数据渲染是需要基于多个数据时第一种方法,可以采用methods属性中的方法计算返回值来实现,先来看示例: <div id ...
- vue computed和methods 计算属性和侦听器
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Vue学习笔记之计算属性和侦听器
0x00 计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div> {{ message.split(''). ...
- 【Vue】Vue框架常用知识点 Vue的模板语法、计算属性与侦听器、条件渲染、列表渲染、Class与Style绑定介绍与基本的用法
Vue框架常用知识点 文章目录 Vue框架常用知识点 知识点解释 第一个vue应用 模板语法 计算属性与侦听器 条件渲染.列表渲染.Class与Style绑定 知识点解释 vue框架知识体系 [1]基 ...
- Vue.js之Vue计算属性、侦听器、样式绑定
前言 上一篇介绍了Vue的基本概念,这一篇介绍一下Vue的基本使用. 一.搭建一个Vue程序 1.1 搭建Vue环境 搭建Vue的开发环境总共有三种方法: 引入CDN <script src=& ...
- vue计算属性和侦听器
一.计算属性: main.js: var app = new Vue({ el: '#app', data: { math: 80, physics: 90, english: 30 }, compu ...
- Vue学习之vue中的计算属性和侦听器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 一起学Vue之计算属性和侦听器
概述 在Vue开发中,模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.当你想要在模板中多次引用相同表达式时,就会更加难以处理.所以,对于任何复 ...
随机推荐
- ReactNative 踩坑笔记
1.fatal error: 'React/RCTBridgeDelegate.h' file not found 这个问题是应为没有安装cocoaPods 所以无法安装ios需要的第三方库.安装co ...
- .net工作流引擎ccflow集成并增加自定义功能
一.为什么需要自定义扩展 1.第三方类库已满足大部分需求,剩下的根据具体业务需求抽象成公共功能进行扩展 2.第三方呈现的web页面与原类库耦合度较高,希望在原页面上扩展而不影响原来的功能 3.在完全不 ...
- Centos7.7安装expect命令工具
简单介绍 expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预.说白了,expect就是一套用来实现自动交互功能的软件. 在实际工作中,我们运行命令.脚本或程序时,这些命令.脚本 ...
- beego从入门到弃坑(一)
最近由于要写课程设计的原因,我便开始一边学习beego,一边开始用它写一个小型的管理系统.但是只有你真正的去用的时候,才会发现这个框架巨坑,他是第一个让我写出了心里阴影的框架,也是第一个让我写着写 ...
- JavaSpring【五、AOP基础】
概念: AOP--面向切面编程,通过预编译/动态代理实现程序功能的统一维护 主要功能是:日志.性能统计.安全控制.事务处理.异常处理 实现方式 预编译--AspectJ 动态代理--SpringAOP ...
- linux入门常用指令1.配置本地yum源
创建光盘挂载点 [root@localhost /]# mkdir /mnt/cdrom 挂载光盘 #挂载光盘 [root@localhost /]# mount /dev/cdrom /mnt/cd ...
- 004.MVC视图、辅助方法
一.视图基础- 视图定义: 用户界面,是显示应用程序用户界面(UI)组件 Web应用程序:页面 作用: 1.输出/显示模型数据 2.出入提交 视图建议在View文件夹位置存储视图 视图引擎(了解):本 ...
- Educational Codeforces Round 37 (Rated for Div. 2)C. Swap Adjacent Elements (思维,前缀和)
Educational Codeforces Round 37 (Rated for Div. 2)C. Swap Adjacent Elements time limit per test 1 se ...
- 洛谷 P2746 [USACO5.3]校园网Network of Schools (Tarjan,SCC缩点,DAG性质)
P2746 [USACO5.3]校园网Network of Schools https://www.luogu.org/problem/P2746 题目描述 一些学校连入一个电脑网络.那些学校已订立了 ...
- Python单例模式(Singleton)的N种实现
很多初学者喜欢用全局变量,因为这比函数的参数传来传去更容易让人理解.确实在很多场景下用全局变量很方便.不过如果代码规模增大,并且有多个文件的时候,全局变量就会变得比较混乱.你可能不知道在哪个文件中定义 ...