1、初识Vue
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
<script src="js/my.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="navigator">
<ul>
<li v-for="tab in navigator">
{{tab.text}}
</li>
</ul>
</div>
<script>
new Vue(
{
el:"#navigator",
data:{
navigator:[
{text:'北京'},
{text:'上海'},
{text:'黑龙江'},
{text:'内蒙古'},
{text:'四川'},
{text:'西藏'}
],
page:"人民的名义"
}
}
);
</script>
</body>
</html>
2、插值
- 使用mustache语法,即双大括号{{ }}
- 只需渲染一次,不在关心数据变化使用*
<span>text:{{*text}}
- 处理html标签使用仨个大括号{{{ }}}
<div>logo:{{{logo}}}</div>
logo:'<span>pku</span>'
- 在标签内部使用双括号
<div data-id="{{id}}"></div>
3、表达式
表达式后面可以添加过滤符,返回字符串的全大写形式,允许过滤器串联,也允许过滤器带参数
- 允许过滤器串联
{{example |过滤器A | 过滤器 B}}
- 过滤器带参数
- {{example | 过滤器A 参数 a,参数b}}
4、指令
指令是特殊的带有前缀v-的特性,指令的值限定为绑定表达式,指令的职责就是当其表达式的值改变时,把某些特殊的行为应用到dom上。
<div v-if='true'>dddd</div>
指令和表达式之间用冒号分割,如v-bind
5、v-if指令
v-if后面没有使用mustache语法绑定,根据isdisplay的值来向html插入一个标签
v-if是惰性的,初始渲染时条件如果为假,则说明都不做,直到第一次为真的时候再做
<!DOCTYPE html>
<html>
<head>
<script src="vue.js" charset="utf-8"></script>
</head>
<body>
<div id="address" v-if="isdisplay">北京市海淀区</div>
<script type="text/javascript">
new Vue({
el:"#address",
data:{
isdisplay:false,
}
});
</script>
</body>
</html>
template包装
<!DOCTYPE html>
<html>
<head>
<script src="vue.js" charset="utf-8"></script>
</head>
<body>
<div id="address" >
<template v-if="isdisplay">this is templaet</template>
<div v-if="isshow">how about show</div>
</div>
<script type="text/javascript">
new Vue({
el:"#address",
data:{
isdisplay:true,
isshow:true,
}
});
</script>
</body>
</html>
6、v-show指令
实际上和v-if基本一致,如果v-show的值为真,则显示,反之则不显示,
v-show始终会被编译
<!DOCTYPE html>
<html>
<head>
<script src="vue.js" charset="utf-8"></script>
</head>
<body>
<div id="address" v-show="isdisplay">北京市海淀区</div>
<script type="text/javascript">
new Vue({
el:"#address",
data:{
isdisplay:false,
}
});
</script>
</body>
</html>
7、v-else指令
<html>
<head>
<script src="vue.js" charset="utf-8"></script>
</head>
<body>
<div id="fengray">
<div v-if="isdisplay">when if is true</div>
<div v-else>then else</div>
<div v-if="Math.random()>0.5"> random is bigger then 0.5</div>
<div v-else>random is smaller then 0.5</div>
</div>
<script type="text/javascript">
new Vue({
el:"#fengray",
data:{
isdisplay:true,
isshow:true,
}
});
</script>
</body>
</html>
8、v-modle指令 (双向绑定)
用于控件的绑定,自动判断是哪一类控件,并绑定到相应的vue对象数据中去,起作用的主要是input,select,text,checkbox,radio等表单空间元素
在输入框输入文本的同时,可以直接写入到页面。一方面绑定到数据层,一方面绑定到表现层
<html>
<head>
<script src="vue.js" charset="utf-8"></script>
</head>
<body>
<div id="fengray">
<form action="#">
<label>name</label><input type="text" v-model="formdata.name"/><br>
<label for="male">male</label><input type="radio" v-model="formdata.gender" value="one"/><br>
<label for="female">female</label><input type="radio" v-model="formdata.gender" value="two"/><br>
<label>interest</label><br>
<lable for="read">read</lable>
<input type="checkbox" value="read" v-model="formdata.interest" /><br>
<lable for="sport">sport</lable>
<input type="checkbox" value="read" v-model="formdata.interest" /><br>
<lable for="sing">sing</lable>
<input type="checkbox" value="read" v-model="formdata.interest" /><br>
<input type="submit" value="submit">
<select v-model="formdata.identity">
<option value="teacher" selected>teahcer</option>
<option value="doctor">doctor</option>
<option value="layer">lawyer</option>
</select>
</form>
</div>
<script type="text/javascript">
new Vue(
{
el:"#fengray",
data:{
formdata:{
name:"zhangsan",
gender:"two",
interest:["read","sport","read"],
identity:'doctor'
}
}
}
);
</script>
</body>
</html>
9、v-model指令的参数
-
1、number
将用户输入的值自动地转换为Number类型 -
2、lazy
同步数据的时候,讲用户的输入改到change事件发生的时候,类似于懒加载
<html>
<head>
<script src="vue.js" charset="utf-8"></script>
</head>
<body>
<div id="fengray">
<form action="#">
<input type="text" v-model="msg" lazy/><br/>
{{msg}}<br/>//在change事件之后才和输入框同步
</form>
</div>
<script type="text/javascript">
new Vue(
{
el:"#fengray",
data:{
msg:'content change is after onchange event',
}
}
);
</script>
</body>
</html>
- 3、debounce
设置一个最小延时,等到延时结束之后再同步数据
<html>
<head>
<script src="vue.js" charset="utf-8"></script>
</head>
<body>
<div id="fengray">
<form action="#">
<input type="text" v-model="msg" debounce="5000"/><br/>//清空输入框5秒后,下面的msg才被清空,上机无法实现
{{msg}}<br/>
</form>
</div>
<script type="text/javascript">
new Vue(
{
el:"#fengray",
data:{
msg:'hello world',
}
}
);
</script>
</body>
</html>
10、实例与数据
- 1.通过构造函数创建一个Vue的根实例
var app=new Vue( { } );
- 2.必不可少的一个选项就是el,el指定页面中已存在的Dom元素来挂载Vue实例。通过id来挂载。实际上可以是HTMLElement,也可以是CSS选择器。
<script type="text/javascript">
var app=new Vue(
{
el:document.getElementById('app'),
}
);
</script>
- 3、 挂载成功后,可以通过myapp.$el来访问该元素
- 4、Vue实例的data选项,可以声明应用内书需要双向绑定的数据,建议所有要用到的数据都预先在data内声明。
vue实例本身也代理了data对象的所有属性,可以通过app.属性名来访问
<script type="text/javascript">
var app=new Vue(
{
el:document.getElementById('app'),
data:{
myname:'zhangsan'
}
}
);
console.log(app.myname);
</script>
5、除显示声明数据外,也可以指向一个已有的变量,并且他们之间默认建立了双向绑定,当修改其中一个时,另一个也会一起变化
<script type="text/javascript">
var mydata={
name:"lisi"
}
var app=new Vue(
{
el:document.getElementById('app'),
data:mydata,
}
);
console.log(app.name);//lisi
mydata.name="zhangsan";
console.log(app.name);//zhangsan
app.name='wanger';
console.log(mydata.name);//wanger
</script>
11、生命周期(钩子)
常见生命周期钩子
- created:实例创建完成后调用。此阶段完成了数据的观测,但未挂载,$el还不可用。
- mounted:el挂载到实例上之后调用,一般我们的第一个业务逻辑活在这里开始
- beforeDestory:实例销毁之前调用,主要解绑一些使用addEventListener监听的事件等。
钩子也是作为选项写入vue实例内,并且狗仔的this指向的事调用它的vue实例:
以下代码在控制台内并未输出(vue2.6)
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
name:"zhangsan",
created:function(){
console.log(this.name);
},
mounted:function(){
console.log(this.¥el);
}
}
});
12、插值与表达式
以下mounted时总是无法执行,这些钩子使用不了
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
name:"zhangsan",
date:new Date(),
mounted:function(){
var _this=this;//声明一个变量指向Vue实例this,保持作用域一致
this.timer=setInterval(function(){//创建一个timer定时器
_this.date=new Date();
},1000);
},
berforeDestory:function(){
if(this.timer){
clearInterval(this.timer);//销毁实例前,清除定时器
}
}
}
});
</script>
12、v-html直接输出html
输出html,而不是将数据解释后的纯文本进行输出使用v-html,下例生成一个连接
<html>
<head>
<meta charset="utf-8">
<script src="vue.js"></script>
<title>ex02javascript</title>
<style type="text/css">
</style>
</head>
<body>
<div id="app">
<span v-html="mylink"></span>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
mylink:"<a href='http://www.sina.com'>这是一个连接</a>",
}
});
</script>
</body>
</html>
13、v-pre直接跳过编译可以输出双大括号
<div id="app">
<span v-pre>{{这里的内容不会被编译}}</span>
</div>
14、{{}}中进行简单的运算
只支持单个表达式,不支持语句和流程控制,不能使用自定义全局变量,只能使用vue白名单内的全局变量。
<body>
<div id="app">
<span>{{number/10}}--{{isok?'sure':'not sure'}}--{{text.split(',').reverse().join(',')}}</span>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
number:100,
isok:false,
text:'123,456',
}
});
</script>
</body>
15、过滤器
- 通过在{{}}的尾部添加管道符 | 对数据进行过滤。经常用于格式化文本
- 过滤规则是自定义的,通过给vue实例添加选项filter来设置。
<div id="app">
<!--这里date就是fromDate的参数-->
{{date | formDate}}
</div>
<script type="text/javascript">
//月、日,小时前不足两位补0
var padDate=function(value){
return value<10?'0'+value:value;
}
var app=new Vue({
el:"#app",
data:{
date:new Date(),
},
//这里是单独的filter
filters:{
formDate:function (value){
var date=new Date(value);
var year=date.getFullYear();
var month=padDate(date.getMonth()+1);
var day=padDate(date.getDate());
var hours=padDate(date.getHours());
var minuters=padDate(date.getMinutes());
var seconds=padDate(date.getSeconds());
//将整理好的数据返回
return year+'-'+month+'-'+day+'-'+hours+':'+minuters+':'+seconds;
}
}
});
</script>
</body>
</html>
- 过滤器可以串联,也可以接收参数
串联
{{ message | filterA | filter B}}
接收参数
{{ message | filterA ('arg1','arg2')}}
16、指令2
指令的主要职责就是当其表达式的值改变时,相应地将某些行为应用到dom上
数据驱动Dom是vue的核心理念,不到万不得已不要主动去操作dom。
<div id="app">
<div v-if="isdisplay">是否显示</div>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
isdisplay:true,
},
});
</script>
</body>
17、v-bind指令动态更新属性
动态更新html元素上的属性,比如id,class等。
也就是说bind与属性及属性值有关,{{}}主要与标签内的数据有关,是数据,不是属性值。
<html>
<head>
<script src="vue.js"></script>
</head>
<body>
<div id="app">
<!--这里bind使用冒号:-->
<div><a v-bind:href='mylink'>这是一个连接</a></div>
<div><img v-bind:src='imgurl'/></div>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
isdisplay:true,
mylink:'http://www.sina.com.cn', imgurl:'http://n.sinaimg.cn/ent/4_img/upload/a57892fc/300/w440h660/20210103/220e-kherpxx1959782.jpg',
},
});
</script>
</body>
</html>
18、v-on指令动态更新事件
v-on绑定事件监听器
可以绑定的事件还有click,dbclick,keyup,mouseover
这些函数都写在vue对象的methods属性内。
案例:点击按钮隐藏内容
<body>
<div id="app">
<p v-if="show">这是一段文本</p>
<button v-on:click="handleClose">点击隐藏</button>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
show:true,
},
//方法,过滤器等单独做一个对象来存储
methods:{
handleClose:function(){
this.show=false;//这个show是自定义的对象
}
}
});
</script>
</body>
也可以在内联语句中使用
<body>
<div id="app">
<p v-if="show">这是一段文本</p>
<input type="submit" v-on:click="show=false" value="提交">点击隐藏</input>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
show:true,
},
//方法,过滤器等单独做一个对象来存储
methods:{
handleClose:function(){
this.show=false;//这个show是自定义的对象
}
}
});
</script>
</body>
19、语法糖(简化写法)
语法糖是指在不影响功能的情况下,添加某种方法实现同样的效果,从而方便程序开发。其实就是简化写法,如v-bind:简写为只写冒号:
v-bind:简写为:
v-on:简写为@
类似小程序开发也有类似的写法