vue
是一个mvvm
的框架,和angular
类似,但比较小巧,容易上手,尤其适用于移动端的项目。vue
的通常用法为一片html
代码配合上json
,再new
出来vue
实例即可。vue
与angular
的共同点是均不兼容低版本的IE浏览器(如IE6
,7
,8
)。
一、vue的下载及引包
vue的官网地址为:https://cn.vuejs.org/。在官网首页,选择点击"起步",在跳转的页面的左侧边栏当中,选择"教程"为"2.x",接下去点击下面的"安装",在安装选择界面下,选择直接由<script>
标签引入,接下去选择点击"开发版本",把vue.js
文件下载到本地的项目文件夹当中。接下去我们在html
页面当中通过<script src="vue.js"></script>
引入即可。
二、vue的起步使用
vue使用的基本骨架如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script src="vue.js"></script>
<script>
window.onload = function(){
var vm = new Vue({
el:"#box",
data:{
msg:"hello world!"
}
});
}
</script>
</head>
<body>
<div id="box">
<h1>{{msg}}</h1>
</div>
</body>
</html>
我们在入口函数内部,使用new Vue({})
来生成一个vue
实例,使用变量vm
来接收,该变量名可任取。在该vue
实例内部接收一个json
对象,该对象的el
属性是为了确定该vue
实例的适用范围。el
的属性值类似于jquery
当中的选择器,可以选择#id
、.class
、tagname
的形式。该对象的data
属性值为一个json
对象,可以给出多组数据键值对。我们在html
所选择的容器内使用{{msg}}
即可显示data
当中msg
对应的属性值。
三、vue的常用指令
指令扩展了html
标签的功能,或者说是扩展了html
标签的属性,因为指令一般都是作为html
标签的属性出现,直接加在html
标签当中。
1、v-model
该指令一般用于表单元素,如input
标签。该指令值通常为vue
实例当中data
的某个属性名,即对应该数据属性值。
<div id="box">
<input type="text" v-model="msg">
<h1>{{msg}}</h1>
</div>
vue
支持双向数据绑定,即当用户改变文本框当中的值时,相当于改变了msg
的属性值,则页面当中所有与msg
数据有关的模板数据都会发生同步的改变。
2、v-for
该指令一般用于实现vue
当中数组数据的循环。我们给要循环生成的标签对加上指令v-for="(value,index) in arr"
,即可根据arr
的数组长度,循环生成多对标签对。其中arr
对应data
当中给定的数组名,value
与index
为变量名,可任取,不过参数顺序不可变,第一个参数对应该数组当中的值,第二个参数对应索引号。我们在html
标签对当中使用{{value}}
和{{index}}
可以获取并显示。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script src="vue.js"></script>
<script>
window.onload = function(){
var vm = new Vue({
el:"#box",
data:{
msg:"hello world!",
arr:['apple','banana','pear','tomato']
}
});
}
</script>
</head>
<body>
<div id="box">
<ul>
<li v-for="(val,key) in arr">{{key}}--{{val}}</li>
</ul>
</div>
</body>
</html>
当我们不需要使用该数组的索引号时,可以把指令简写为v-for="value in arr"
,此时value
对应为数组的值。该指令也可以实现对json
对象的循环,如v-for=(val,key) in json"
,其中json
对应data
当中json
属性名,第一个参数对应遍历到的value
值,第二个参数对应遍历到的key
值。
3、v-on
该指令一般用于对页面当中的DOM
元素进行事件绑定。如v-on:click="show()"
即代表当单击该元素时执行show
这个事件函数,该函数名必须事先在vue
实例的methods
对象当中声明定义过。new Vue({})
实例对象当中data:{}
对象的数据,可以看做是这个示例对象的属性。而methods:{}
对象当中罗列的事件函数,可以看做是这个实例对象的方法。
<script>
window.onload = function(){
var vm = new Vue({
el:"#box",
data:{
msg:"hello world!",
arr:['apple','banana','pear','tomato']
},
methods:{
show:function(){
alert(1);
}
}
});
}
</script>
<div id="box">
<button v-on:click="show()">按钮</button>
</div>
不过我们在给某个DOM
标签元素进行事件绑定时,v-on:click="show()"
等价于@click="show()"
,我们一般都采用简写的方式。
我们在vue
实例对象的方法函数体内使用this
可以获取该实例对象当中的数据属性值,即data
当中定义的数据。
<script>
window.onload = function(){
var vm = new Vue({
el:"#box",
data:{
arr:['apple','banana']
},
methods:{
add:function(){
this.arr.push('tomato');
}
}
});
}
</script>
<div id="box">
<button v-on:click="add()">add</button>
<ul>
<li v-for="(value,index) in arr">{{index}}--{{value}}</li>
</ul>
</div>
即每次点击按钮,arr
数组当中都会追加一项,由于vue
具有双向数据绑定的特性,故当数据发生改变时,在页面当中与该数据有关的模板也会相应的发生改变。
4、v-show
该指令可以控制DOM
元素的显示与隐藏。我们给DOM
元素加上指令v-show="true"
则可以控制该元素显示,若加上指令v-show="false"
则可以控制该元素隐藏。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script src="vue.js"></script>
<style>
.test{
margin:20px;
width:100px;
height:100px;
background-color: skyblue;
}
</style>
<script>
window.onload = function(){
var vm = new Vue({
el:"#box",
data:{
a:true
},
methods:{
}
});
}
</script>
</head>
<body>
<div id="box">
<button @click="a=false">change</button>
<div class="test" v-show="a"></div>
</div>
</body>
</html>
在@click=""
内部可以直接由属性名来获取vue
实例对象的数据属性,并对其进行赋值操作。
5、v-once
该指令用于明确只绑定一次数据,当数据更新之后,模板不会随之变化。
<script>
window.onload = function(){
var vm = new Vue({
el:'#box',
data:{
msg:'hello world!'
}
});
};
</script>
<div id="box">
<input type="text" v-model="msg">
<h2 v-once>{{msg}}</h2>
</div>
示例代码如上所示,当给标签加上v-once
指令后,则该标签只绑定一次数据,之后当用户改变文本框当中的值,从而改变vue
实例的data
当中的msg
的属性值时,h2
标签内的模板数据不会随之发生改变。
6、v-html
该指令可以用于将数据内容进行html
转义输出。
<script>
window.onload = function(){
var vm = new Vue({
el:'#box',
data:{
msg:'<h1>welcome</h1>'
}
});
};
</script>
<div id="box">
<input type="text" v-model="msg">
<div v-html="msg"></div>
</div>
示例代码如上所示,当给标签加上v-html
指令,并且指令值为数据的属性名,可以将数据内容进行html
转义输出后,呈现在该标签对当中。此时不再需要写{{msg}}
。
7、v-cloak
由于我们在模板当中用{{}}
这种标记内方式数据,所以当数据请求慢的时候,用户可能会看到花括号标记,使用v-cloak
指令可以防止闪烁,防止用户看到花括号标记。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
[v-cloak]{
display:none;
}
</style>
<script src="vue.js"></script>
<script>
window.onload = function(){
var vm = new Vue({
el:'#box',
data:{
msg1:'welcome',
msg2:'hello',
msg3:'world'
}
});
};
</script>
</head>
<body>
<div id="box">
<div v-cloak>
<h1>{{msg1}}</h1>
<h2>{{msg2}}</h2>
<h3>{{msg3}}</h3>
</div>
</div>
</body>
</html>
示例代码如上所示,我们需要在style
标签对内对v-cloak
属性选择器进行样式设定。该指令一般用在一个比较大的段落当中,单个标签标记不用这个指令,即当一个div
的子代有多处用到花括号标记,则我们只需给父级div
标签加上v-cloak
指令即可。
8、v-text
该指令也是为了防止闪烁,防止用户看到花括号标记,上述的v-cloak
指令一般用于比较大的段落,但对于单个标签来说,可以使用v-text
这个指令。
即之前我们使用的<h1>{{msg}}</h1>
与<h1 v-text="msg"></h1>
数据呈现的效果等价,但使用第二种写法时,即使网速再慢,也看不到花括号标记,可以达到防止闪烁的目的。
四、vue制作简易留言本
我们使用bootstrap
进行简单的页面布局,留言本页面如下所示:
当没有留言时,显示暂无数据。当用户输入姓名和留言之后,点击提交按钮,则留言列表区就可以显示留言信息,暂无数据的提示消失,出现一个删除全部的按钮,留言序号从1开始增加,后添加的留言显示在上面,每一行留言的右侧都有一个删除按钮,选择点击删除按钮即可删除对应的留言,点击全部删除按钮就可以删除全部的留言,此时再次出现暂无数据的提示。
示例源代码为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="js/jquery-1.11.3.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="vue.js"></script>
<style>
h2{
text-align: center;
}
.board ul{
list-style: none;
}
.board li{
margin-left: 110px;
padding-left: 40px;
height: 50px;
line-height: 50px;
border-bottom: 1px solid #ccc;
font-size: 18px;
position: relative;
}
.board li button{
top:10px;
position: absolute;
right: 50px;
}
</style>
<script>
window.onload = function(){
var vm = new Vue({
el:"#box",
data:{
name:'',
message:'',
list:[]
},
methods:{
submit:function(){
if(this.name==''||this.message=='') return;
this.list.unshift({name:this.name,message:this.message});
this.name = '';
this.message = '';
},
deleteMsg:function(index){
if(index == -1){
this.list = [];
}else{
this.list.splice(index,1);
};
}
}
});
}
</script>
</head>
<body>
<div id="box">
<h2>我的留言本</h2>
<div class="container">
<form class="form-horizontal">
<div class="form-group">
<label for="name" class="col-sm-2 control-label">姓名</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="name" v-model="name">
</div>
</div>
<div class="form-group">
<label for="message" class="col-sm-2 control-label">留言</label>
<div class="col-sm-10">
<textarea class="form-control" rows="3" id="message" v-model="message"></textarea>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="button" class="btn btn-success" @click="submit()">提交</button>
</div>
</div>
</form>
<div class="board">
<h2>留言列表区</h2>
<ul>
<li v-for="(item,key) in list">【序号】:{{list.length-key}}【姓名】:{{item.name}}【留言】:{{item.message}}
<button type="button" class="btn btn-danger" @click='deleteMsg(key)'>删除</button>
</li>
<li v-show="list.length==0">暂无数据......</li>
<li v-show="list.length!=0"><button type="button" class="btn btn-danger" @click='deleteMsg(-1)'>删除全部</button></li>
</ul>
</div>
</div>
</div>
</body>
</html>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。