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。