数据绑定
Vue.js 的核心是实现了 MVVM 模式,它扮演的角色就是 ViewModel 层
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
</head>
<body>
<div id="app">
{{ message }}
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
message: 'Hello Vue!',
},
})
</script>
</body>
</html>
MVVM再理解
MVVM的设计思想:关注Model的变化,让MVVM框架去自动更新DOM的状态,从而把开发者从操作DOM的繁琐步骤中解脱出来
安装Vue.js devtools
离线安装
先解压Vue.jsDevtools
然后在Chrome中加载已解压的扩展程序
在线安装
先离线安装安装谷歌访问助手
然后在Chrome网上应用商店,搜索Vue.js devtools扩展程序,并安装
使用VUE插件
MVVM 模式中要求 ViewModel 层就是使用 观察者模式 来实现数据的监听与绑定,以做到数据与视图的快速响应。
ViewModel层:浏览器控制台输入:vm.message=”xxxx” 看看效果。
发现网页内容立即更新,且不刷新页面(双向绑定)
改变JavaScript对象的状态,会导致DOM结构作出对应的变化!这让我们的关注点从如何操作DOM变成了如何更新JavaScript对象的状态,而操作JavaScript对象比DOM简单多了
数据绑定指令
使用数据绑定指令做数据渲染
单向 v-bind:
双向 v-model=
注意:v-model只用于用户交互组件中
绑定事件监听 v-on
<body>
<div id="app">
<button v-on:click="study">去学习</button>
</div>
<script src="vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
company: '尚硅谷'
},
methods: {
study(){
alert('我要去' + this.company + '学习')
}
}
})
</script>
</body>
使用 v-on 进行事件绑定,v-on:click 表示处理鼠标点击事件,事件调用的方法定义在 vue 对象声明的 methods 节点中
v-on 指令的简写形式
<button @click="study">去学习</button>
计算属性
计算属性的重点突出在 属性
两个字上(属性是名词),首先它是个 属性
其次这个属性有 计算
的能力(计算是动词),这里的 计算
就是个函数;简单点说,它就是一个能够将计算结果缓存起来的属性(将行为转化成了静态的属性);可以想象为缓存!
为什么使用
<body>
<div id="app">
<p>原始值: {{ message }}</p>
<p>反转消息: {{ message.split('').reverse().join('') }}</p>
</div>
</body>
<script>
new Vue({
el: '#app',
data: {
message: 'hello',
},
})
</script>
</html>
模板表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会难以维护。
计算属性VS方法
- computed:定义计算属性,不需要带括号;
- methods:定义方法,需要带括号
调用方法时,每次都需要进行计算,既然有计算过程则必定产生系统开销,那如果这个结果是不经常变化的呢?此时就可以考虑将这个结果缓存起来,采用计算属性可以很方便的做到这一点,计算属性的主要特性就是为了将不经常变化的计算结果进行缓存,以节约我们的系统开销;
侦听器watch
虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。
条件渲染
v-if
指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 truthy 值的时候被渲染。
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
</head>
<body>
<div id="app">
<input type="checkbox" v-model="ok" />同意许可协议
<p v-if="ok">yes.</p>
<p v-else>no.</p>
<p v-show="ok">yes.</p>
<p v-show="!ok">no.</p>
</div>
</body>
<script>
new Vue({
el: '#app',
data: {
ok: false,
},
})
</script>
</html>
列表渲染
用 v-for
把一个数组对应为一组元素
我们可以用 v-for
指令基于一个数组来渲染一个列表。v-for
指令需要使用 item in items
形式的特殊语法,其中 items
是源数据数组,而 item
则是被迭代的数组元素的别名。
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
</head>
<body>
<div id="app">
<ul id="example-1">
<li v-for="item in items" :key="item.message">{{ item.message }}</li>
</ul>
</div>
</body>
<script>
var example1 = new Vue({
el: '#example-1',
data: {
items: [{ message: 'Foo' }, { message: 'Bar' }],
},
})
</script>
</html>
结果:
实例生命周期钩子
- Vue 实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载 DOM、渲染→更新→渲染、卸载等一系列过程,我们称这是
Vue 的生命周期。通俗说就是 Vue 实例从创建到销毁的过程,就是生命周期。 - 在 Vue 的整个生命周期中,它提供了一系列的事件,可以让我们在事件触发时注册 JS 方法,可以让我们用自己注册的 JS
方法控制整个大局,在这些事件响应方法中的 this 直接指向的是 Vue 的实例。
每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。
比如 created
钩子可以用来在一个实例被创建之后执行代码:
new Vue({
data: {
a: 1
},
created: function () {
console.log('a is: ' + this.a)
}
})
也有一些其它的钩子,在实例生命周期的不同阶段被调用,如 mounted
、updated
和 destroyed
。生命周期钩子的 this
上下文指向调用它的 Vue 实例。
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h3 id="h3">{{ message }}</h3>
</div>
</body>
<script>
new Vue({
el: '#app',
data: {
message: '床前明月光',
},
created() {
console.log('created')
console.log(this.message)
this.show()
console.log(document.getElementById('h3').innerText)
},
mounted() {
console.log('mounted')
console.log(document.getElementById('h3').innerText)
},
methods: {
show() {
console.log('show方法被调用')
},
},
})
</script>
</html>
不要在选项 property 或回调上使用箭头函数,比如 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
之类的错误。
生命周期图示
下图展示了实例的生命周期。你不需要立马弄明白所有的东西,不过随着你的不断学习和使用,它的参考价值会越来越高。