vue2.x学习笔记(三)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12562137.html。
vue实例
要使用vue提供的特性与功能,都需要通过vue实例来使用。
创建一个vue实例
每一个vue应用,都是通过用Vue函数创建一个新的vue实例开始的。
var vm = new Vue({
// 选项(属性)
})
虽然vue没有完全遵循mvvm模型,但是一些设计还是收到了其中的启发,因此官方文档中经常会使用vm(view-model)这个变量名来表示vue的实例。
所谓的vue实例,就是一个由vue函数创建出来的对象,一切使用vue提供的操作,都是基于这个实例对象上的。当创建一个vue实例的时候,可以传入一个选项对象,这些选项对象,其实就是vue实例对象的属性,用于描述该vue实例对象中的特征与行为。一个vue应用由一个通过Vue函数创建的根vue实例,以及可选的、嵌套的和可复用的组件树组成。
vue实例的数据与方法
当一个vue实例被创建的时候,它会将data对象中的所有的属性加入到vue的响应式系统中,当这些属性的值发生改变的时候,视图会同步响应,匹配更新为新的值。
// 我们的数据对象
var data = { a: 1 } // 该对象被加入到一个 Vue 实例中
var vm = new Vue({
data: data
}) // 获得这个实例上的属性
// 返回源数据中对应的字段
vm.a == data.a // true // 设置属性也会影响到原始数据
vm.a = 2
data.a // // 反之亦然
data.a = 3
vm.a //
而当这些数据发生改变之后,视图就会进行重渲染。值得注意的是,只有当实例被创建的时候就存在于data中的属性才是响应式的,如果在实例创建之后才往data中添加的属性,是不具备【响应式】这个特性的。
vm.b = 'hi'
像上面这行代码,任何对于b的改动都不会触发任何视图的更新。这样的话,所有需要【响应式】特性的属性都必须在实例被创建的时候就存在与data中,即使一开始它为空或不存在,你也需要在data中提前定义该属性并赋予相应的初值(默认值),以此来避免某个属性获取不到【响应式】的特性。
data: {
yanggb1: '',
yanggb2: 0,
yanggb3: false,
yanggb4: [],
yanggb5: null
}
这里的唯一例外是使用Object.freeze()方法,这个方法会阻止修改现有的属性,意味着响应系统无法再追踪数据的变化而使属性失去了【响应式】的特性。
var obj = {
foo: 'bar'
}
Object.freeze(obj)
new Vue({
el: '#app',
data: obj
})
<div id="app">
<p>{{ foo }}</p>
<!-- 这里的 `foo` 不会更新! -->
<button v-on:click="foo = 'baz'">Change it</button>
</div>
除了数据属性之外,vue实例还暴露了一些有用的实例属性与方法,它们的一个特点是命名前缀都是【$】,意图是与用户定义的属性与方法区分开,比如$data、$el和$watch等。
var data = { a: 1 }
var vm = new Vue({
el: '#example',
data: data
})
vm.$data === data // true
vm.$el === document.getElementById('example') // true
// $watch 是一个实例方法
vm.$watch('a', function (newValue, oldValue) {
// 这个回调将在vm.a改变后调用
})
我们也可以很轻松地通过控制台稍微浏览下都有哪些特定的实例属性与方法。

这些特定的实例属性和方法都有特定的使用场景,官方也提供了相应的api文档来方便开发者查阅和使用,这里就先稍微了解一下,知道有这些个东西就好了。
实例生命周期钩子
每一个vue实例在被创建的时候都要经过一系列的初始化过程,例如需要设置数据监听、编译模板或将实例挂载到dom并在数据变化时更新dom等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,提供了用户在不同的阶段添加特定的逻辑代码的机会。这里最重要的一点是,生命周期钩子是函数,生命周期钩子是函数,生命周期钩子是函数,也有人叫做生命周期钩子函数,一些初学者(比如我)看到【生命周期钩子】这个名词可能会一头雾水,其实也就是一些函数而已,只是这些函数是和vue实例创建的一系列初始化过程密切相关,在每个特定的阶段会执行某个特定的生命周期钩子函数。比如created钩子函数可以用来在一个实例被创建之后执行代码。
new Vue({
data: {
a: 1
},
created: function () {
// this指向的是vm实例
console.log('a is: ' + this.a) // "a is: 1"
}
})
还有其他的钩子函数,比如mouted、updated和destroyed,它们会在实例生命周期的不同阶段被调用。特别说明的是,在生命周期钩子函数中,如果使用this关键字的话,this的上下文是指向的调用它的vue实例。
不要在选项属性或回调上使用箭头函数,比如
created: () => console.log(this.a)或vm.$watch('a', newValue => this.myMethod())。因为箭头函数并没有this,this会作为变量一直向上级词法作用域查找,直至找到为止,经常导致Uncaught TypeError: Cannot read property of undefined或Uncaught TypeError: this.myMethod is not a function之类的错误。
上面这段话是官方文档上特别标注的使用生命周期钩子的注意事项,总结就是,除了自己实现的逻辑以外,建议不要在vue中使用箭头函数(只要是vue提供的都避免使用),否则可能出现意料之外的错误。
生命周期图示
官方文档放出了一张实例生命周期的图示,对于开发者来说,几乎是教科书般的存在。

初学者并不需要马上弄懂整张图,而是应该随着学习的深入,慢慢弄懂(会自然弄懂嘛)。
"我还是很喜欢你,像鲸沉于海底,温柔无息。"
vue2.x学习笔记(三)的更多相关文章
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- NumPy学习笔记 三 股票价格
NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记三:函数
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
随机推荐
- 两个看似相同,结果不同的SQL逻辑
一朋友问我的,看着挺有意思,记录一下: 表item1,里面有上面三个字段,一共10条数据,接下来有两个相似的sql语句得到了不一样的查询结果. 表数据如下: 两条SQL及查询结果: 我的理解答: S ...
- 关于利用python进行验证码识别的一些想法
转载:@小五义http://www.cnblogs.com/xiaowuyi 用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章.我大体看了一下,主要方法有几类: ...
- Selenium系列(十二) - 自动化必备知识之CSS选择器的详细使用
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- (note)从小白到产品经理之路
学习了云课堂的产品课程,整理出部分笔记,以作备用参考,方便实际运用过程中查看巩固. 1.产品工具:Axure.mindmanager.viso.办公软件wps 2.产品人需要具备的品格 富有同理心,习 ...
- coding++:thymelef 模板报错 the entity name must immediately follow the '&' in the entity reference
thymelef模板里面是不能实用&符号的 要用&转义符代替,官网也有文档说明可以用官方的通配符代替, 官方文档 http://www.thymeleaf.org/doc/tutori ...
- 下拉框select->option中如何把参数传到视图函数中去
例子: <select name="p_id" id=""> {% for p in permissions %} <option value ...
- Ubuntu复制粘贴快捷键
复制:[Ctrl+Insert] 粘贴:[Shitf+Insert]
- prometheus+grafana实现监控过程的整体流程
prometheus安装较为简单,下面会省略安装步骤: 一.服务器启动 Prometheus启动 ./prometheus --config.file=prometheus.yml Grafana启动 ...
- Shell:Day05.笔记
交互输入与for语句 1.交互输入 read Python中用input()函数,进行输入: read命令同时可以定义多个变量值:而输入的内容默认以空格为分隔符,将值输入到对应的变量中: 如果默认 ...
- Shell:Day04.笔记
grep与正则表达式: 1.grep程序 Linux下有文本处理三剑客 - - grep sed awk grep:文本 行 过滤工具 sed:文本 行 编辑器(流编辑器) awk:报告生成器(做文本 ...