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。