Vue学习笔记
Vue.js实战.梁灏
数据绑定和第一个Vue应用
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Vue 示例</title>
</head>
<body>
<div id="app">
<input type="text" v-model="name" placeholder="你的名字">
<h1>你好,{{ name }}</h1>
</div>
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
<script>
var app=new Vue ({
el:'#app',
data: {
name: ''
}
})
</script>
</body>
</html>
这段代码展示了Vue.js最核心的功能:数据的双向绑定,调用那段网址就是引入Vue的库。
运行这段程序,在输入框输入的内容会实时展示在页面的h1标签内。
2.1 Vue实例与数据绑定
2.1.1 实例与数据
Vue.js应用的创建很简单,通过构造函数Vue就可以创建出一个Vue的根实例,并启动Vue应用。
var app=new Vue ({
})
变量app就代表了这个Vue实例,事实上,几乎所有代码都是一个对象,写入Vue实例的选项内的。
首先,必不可少的一个选项就是el。el用于指定一个页面中已存在的DOM元素挂载Vue的实例,它可以是HTML Element,也可以是CSS选择器。比如:
<div id="app"></div>
var app=new Vue ({
el: document.getElementById('app')//或者是'#app',如开头那段程序
})
挂载成功后,我们可以通过app.$el来访问该元素。Vue提供了很多常用的实例属性与方法,都以$开头,比如$el。后续还会介绍更多有用的方法。
回顾章节开始的代码,在input标签上有一个v-model的指令,它的值对应我们创建的Vue实例中的data选项中的name字段,这就是Vue的数据绑定。
通过Vue实例的data选项,可以声明应用内需要双向绑定的数据。建议所有会用到的数据都预先在data内声明,这样不至于将数据散落在业务逻辑中,难以维护。
Vue实例本身也代理了data对象内的所有属性,所以可以这样访问:
var app=new Vue ({
el:'#app',
data: {
a: 2
}
})
console.log(app.a);//2
除了显式的声明数据外,也可以指向一个已有的变量,并且它们之间默认建立了双向绑定,当修改其中任意一个时,另一个也会起变化:
var myData = {
a:1
}
var app=new Vue ({
el:'#app',
data: myData
})
console.log(app.a);//1
app.a=2;
console.log(myData.a);//2
myData.a=3;
console.log(app.a);//3
2.1.2 生命周期
每个Vue实例创建时,都会经历一系列的初始化过程,同时也会调用相应的生命周期钩子,我们可以利用这些钩子,在合适的时机执行我们的业务逻辑。如果你使用过JQuery,一定知道它的ready()方法,比如如下这些示例:
$(document).ready(function() {
//DOM加载完成后,会执行这里的代码
});
Vue的生命周期钩子与之类似,比较常用的有:
created
实例创建完成之后调用,此阶段完成了数据的观测等,但尚未挂载,$el还不可用。
需要初始化处理一些数据时会比较有用,后面章节将有介绍。
mounted
el挂载到实例上后调用,一般我们的第一个业务逻辑会在这里开始。
beforeDestroy
实例销毁之前调用。主要解绑一些使用addEventListener监听的事件等。
这些钩子与el和data类似,也是作为选项写入Vue的实例内,并且钩子的this指向的是调用它的Vue实例。
var app=new Vue ({
el:'#app',
data:{
a:2
},
created:function () {
console.log(this.a);
},
mounted:function () {
console.log(this.$el);
}
})
2.1.3 插值与表达式
使用双大括号'{{}}'是最基本的文本插值方法,它会自动将我们双向绑定的数据实时显示出来,例如:
<div id="app">{{book}}</div>
<script>
var app=new Vue ({
el:'#app',
data:{
book:'《Vue.js实战》'
}
})
</script>
大括号里的内容会被替换为《Vue.js实战》,通过任何方法修改数据book,大括号的内容都会被实时替换,比如下面的这个实例,实时显示当前的时间,每秒更新:
<div id="app">
{{data}}
</div>
<script>
var app=new Vue ({
el: '#app',
data: {
date:new Date()
},
mounted: function () {
var _this=this;//声明一个变量指向Vue实例this,保证作用域一致
this.timer=setInterval(function() {
_this.date=new Date();//修改数据Date
},1000);
},
beforeDestroy: function() {
if (this.timer) {
clearInterval(this.timer);//在Vue实例销毁前,清除我们的定时器
}
}
})
</script>
如果有的时候就是想输出HTML,而不是将数据解释后的纯文本,可以使用v-html:
<div id="app">
<span v-html="link"></span>
</div>
<script>
var app=new Vue ({
el:'#app',
data: {
link: '<a href="#">这是一个连接</a>'
}
})
</script>
link的内容将会被渲染成一个具有点击功能的a标签,而不是纯文本。这里要注意,如果将用户产生的内容使用v-html输出后,有可能导致XSS攻击,所以要在服务端对用户提交的内容进行处理,一般可将尖括号"<>"转义。
如果想显示{{}}标签,而不进行替换,使用v-pre即可跳过这个元素和它的子元素的编译过程。
例如:
<span v-pre>{{这里的内容是不会被编译的}}</span>
在{{}}中,除了简单的绑定属性值外,还可以使用JavaSrcipt表达式进行简单的运算,三元运算等等,例如:
<div id="app">
{{number/10}}
{{isOK?'确定':'取消'}}
{{text.split(',').reverse().join(',')}}
</div>
<script>
var app=new Vue ({
el:'#app',
data: {
number: 100,
isOK: false,
text: '123,456'
}
})
</script>
显示的结果依次为:10、取消、456,123。
Vue.js支支持单个表达式,不支持语句和流控制。另外,在表达式中,不能使用用户自定义的全局变量,只能使用Vue白名单内的全局变量,例如Math和Date。