第一节(指令)
入门案例
<div id="app">{{msg}}</div>
<script>
var app=new Vue({
el:"#app",
data:{
msg:"Hello Vue!"
}
});
</script>
if else else-if
<div id="app">
<p v-if="isShow=='if'">{{msg}}</p>
<p v-else-if="isShow=='elseif'">{{msg1}}</p>
<p v-else>其他情况</p>
</div>
<script>
var app=new Vue({
el:"#app",
data:{
msg:"Hello Vue!",
msg1:"Hello Vue2!",
isShow:'eleif'
}
});
</script>
v-show
<div id="app">
<p v-show="isShow">{{msg}}</p>
</div>
<script>
var app=new Vue({
el:"#app",
data:{
msg:"Hello Vue!",
isShow:false
}
});
</script>
v-for指令
<div id="app">
<ul>
<li v-for="(item,index) in newItems">{{item}}</li>
</ul>
</div>
<script>
var app=new Vue({
el:"#app",
data:{
items:[11,1,56,3,98,27]
},
computed:{
newItems:function(){
return this.items.sort();
}
}
});
</script>
v-text和v-html
<div id="app">
<p v-text="msg"></p>
<p v-html="msg1"></p>
</div>
<script>
var app=new Vue({
el:"#app",
data:{
msg:"<h1>测试</h1>",
msg1:"<h1>测试1</h1>"
},
});
</script>
v-on指令
<div id="app">
<p>{{msg}}</p>
<input type="text" v-model="msg" v-on:keyup.enter="jiafen">
<button v-on:click="jiafen">加分</button>
</div>
<script>
var app=new Vue({
el:"#app",
data:{
msg:1,
},
methods:{
jiafen:function(){
this.msg=parseInt(this.msg)+parseInt(this.msg);
}
}
});
</script>
v-model 双向数据绑定
基本案例
<div id="app">
<p>{{msg}}</p>
<input type="text" v-model="msg"><br>
<input type="text" v-model.lazy="msg"><br>
<input type="text" v-model.number="msg"><br>
<input type="text" v-model.trim="msg"><br>
</div>
多选绑定一个值
<div id="app">
<p>多选绑定一个值</p>
<input type="checkbox" id="one" v-model="msg"><label for="one">{{msg}}</label>
</div>
<script>
var app=new Vue({
el:"#app",
data:{
msg:true
}
});
</script>
单选绑定一个值
<div id="app">
<p>单选绑定一个值</p>
<input type="radio" id="one" v-model="msg" value="男"><label for="one">男</label>
<input type="radio" id="two" v-model="msg" value="女"><label for="two">女</label>
<br>
<p>{{msg}}</p>
</div>
<script>
var app=new Vue({
el:"#app",
data:{
msg:"男"
}
});
</script>
多选绑定多个值
<div id="app">
<p>多选绑定多个值</p>
<input type="checkbox" id="one" v-model="msg" value="男"><label for="one">男</label>
<input type="checkbox" id="two" v-model="msg" value="女"><label for="two">女</label>
<input type="checkbox" id="three" v-model="msg" value="不明确"><label for="three">不明确</label>
<br>
<p>{{msg}}</p>
</div>
<script>
var app=new Vue({
el:"#app",
data:{
msg:[]
}
});
</script>
说明:注意msg必须是数组,否则会被当成布尔值处理,及要么全选要么全不选
v-bind
<body>
<div id="app">
<!-- 三元运算符显示不同的图片 -->
<img v-bind:src="isOk?pathA:pathB" width="200px" height="300px" >
<!-- 绑定路径 -->
<a :href="path">百度</a>
<!-- 内部绑定style -->
<p :style="{color:'red'}">{{isOk}}</p>
<!-- 绑定外部style,注意此处是class -->
<p :class="[styleA,styleB]">{{isOk}}</p>
<!-- 绑定已经写好的style对象,同理:style也可以对应[]绑定多个 -->
<p :style="styleObj">{{isOk}}</p>
</div>
</body>
</html>
<style>
.styleA{
color: green
}
.styleB{
font-size: 20px
}
</style>
<script>
var app=new Vue({
el:"#app",
data:{
isOk:false,
pathA:"./img/1.jpg",
pathB:"./img/2.jpg",
path:"http://www.baidu.com",
styleA:"styleA",
styleB:"styleB",
styleObj:{
color:'pink',
fontSize:'30px'
}
}
});
</script>
其他指令
v-pre:原样输出
v-cloak:渲染完成后才显示,避免错乱数据和v-text的区别是,text在vue对象没有的时候,及代码有重大错误时候,啥也不显示,但是v-cloak还会原样输出。
v-once:只在第一次渲染时候进行渲染,例如双向数据绑定时候,只想让某一处显示第一次渲染的值。
第二节(全局API)
Vue.directive(自定义指令)
<body>
<div id="app">
<p v-jspang="color">{{msg}}</p>
</div>
</body>
</html>
<script>
Vue.directive("jspang",function(el,bindding){
el.style="color:"+bindding.value;
});
var app=new Vue({
el:"#app",
data:{
msg:"测试",
color:"green"
}
});
</script>
> 说明:利用directive自定义指令是在构造器外面,且自定义指令名称是不加v-的,此处直接是jspang,但是上面使用是v-jspang,注意自定义指令名称不要出现大小写间隔(例如jsPang),会无法识别然后报错。另外,传入的参数el指的就是<p v-jspang="color">{{msg}}</p>这个dom对象,bindding指的是v-jspang="color",bindding.value就是获取的值color,bindding.name就是jspang,可以打印看看bindding其他属性。而v-jspang="color"中的color就对应app对象中的green,从而产生效果。
Vue.extend(构造器延伸)
<body>
<div id="app">
<author></author>
<div id="author"></div>
</div>
</body>
</html>
<script>
var author=Vue.extend({
template:"<a :href='authorUrl'>{{msg}}</a>",
data:function(){
return {
authorUrl:"http://www.baidu.com",
msg:"点击到百度"
}
}
});
new author().$mount("author");
new author().$mount("#author");
</script>
Vue.set(全局操作)
基本案例
<body>
<div id="app">
{{num}}
</div>
<p><button onclick="add()">添加</button></p>
</body>
</html>
<script>
function add(){
//方式一
// Vue.set(objData,"num",++objData.num)
//方式二
// objData.num++;
//方式三
// app.num++;
}
var objData={
num:1
}
var app=new Vue({
el:"#app",
data:objData
});
</script>
数组更新案例
<body>
<div id="app">
<ul>
<li v-for="(item ,index) in nums">{{index}}--{{item}}</li>
</ul>
</div>
<p><button onclick="add()">添加</button></p>
</body>
</html>
<script>
function add(){
// app.nums[0]="测试"; 无效
//有效
Vue.set(objData.nums,1,++objData.nums[1])
}
var objData={
nums:[1,2,3,4]
}
var app=new Vue({
el:"#app",
data:objData
});
</script>
说明: 此时直接app.nums[0]="测试";是无效的,因为js不会监听到数组变化从而也就不会引起dom更新,但是如果在修改之前修改一下其他变量(非数组的),就会引起dom更新,从而数组变化也会有效。注意:Vue.set操作普通数据和数组数据参数有区别.Vue.set(objData.nums,1,++objData.nums[1])其中1是数组索引,和Vue.set(objData,"num",++objData.num);
三种创建模板的形式
<body>
<div id="app">
</div>
<!-- tempalte标签模板,可以在app之外 -->
<template id="tl1">
<p><a href="http://www.baidu.com">百度</a></p>
</template>
<script type="x-template" id="tl2" >
<p><a href="http://www.baidu.com">百度</a></p>
</script>
</body>
</html>
<script>
var app=new Vue({
el:"#app",
template:"#tl2" //template标签模板,通过id设置
// 选项模板
// template:`
// <p><a href="http://www.baidu.com">百度</a></p>
// `
})
</script>
组件
局部组件和全局组件
<body>
<div id="app">
<jspang></jspang>
<jspang1></jspang1>
</div>
</body>
</html>
<script>
// 这是全局组件,虽然是全局的,但是也要放在注册过构造器的
//标签里面使用
Vue.component("jspang",{
template:`<p>{{msg}}</p>`,
data:function(){
return{
msg:"测试"
}
}
});
var app=new Vue({
el:"#app",
components:{
//“jspang1”是组件名称必须是字符串类型,这是局部组件,只能在该构造器
//对应的标签内部使用
"jspang1":{
template:`<p style="color:green">{{msg}}</p>`,
data:function(){
return {
msg:"呵呵呵"
}
}
}
}
})
</script>
props传参基本案例
<body>
<div id="app">
<zengqiang info="xinyang"></zengqiang>
</div>
</body>
</html>
<script>
var app=new Vue({
el:"#app",
data:{
msg:"数据来源"
},
components:{
"zengqiang":{
template:`<p style="color:red">来自--{{info}}</p>`,
props:['info']
}
}
})
</script>
props传参演化案例
<body>
<div id="app">
<zengqiang v-bind:info="msg"></zengqiang>
</div>
</body>
</html>
<script>
var app=new Vue({
el:"#app",
data:{
msg:"xinyang"
},
components:{
"zengqiang":{
template:`<p style="color:red">来自--{{info}}</p>`,
props:['info']
}
}
})
</script>
父子组件
重要案例:
<body>
<div id="app">
<zengqiang v-bind:info="msg"></zengqiang>
</div>
</body>
</html>
<script>
var zengqiangerzi={
template:`
<p style="color:red">来自儿子--{{info1}}</p>
`,
props:['info1']
};
var zengqiang={
template:`
<div>
<p style="color:red">来自--{{info}}</p>
<zengqiangerzi v-bind:info1="msg1"></zengqiangerzi>
</div>
`,
data:function(){
return{
msg1:"henan"
}
},
props:['info'],
components:{
"zengqiangerzi":zengqiangerzi,
}
};
var app=new Vue({
el:"#app",
data:{
msg:"xinyang"
},
components:{
"zengqiang":zengqiang,
}
})
</script>
component标签
基本案例
<body>
<div id="app">
<component v-bind:is="who"></component>
</div>
</body>
</html>
<script>
var c1={
template:`<p style="color:red">测试</p>`
}
var c2={
template:`<p style="color:black">测试</p>`
}
var c3={
template:`<p style="color:pink">测试</p>`
}
var app=new Vue({
el:"#app",
data:{
msg:"xinyang",
who:"c2"
},
components:{
"c1":c1,
"c2":c2,
"c3":c3
}
})
</script>
第三节(构造器选项)
propsDataOption
<body>
<div id="app">
<div id="hehe"></div>
</div>
</body>
</html>
<script>
var header_a=Vue.extend({
template:`<p>{{msg}}--{{info}}</p>`,
data:function(){
return {
msg:"测试信息"
}
},
props:["info"]
});
new header_a({propsData:{info:"参数信息"}}).$mount("#hehe");
</script>
computedOption
<body>
<div id="app">
{{info}}
<br>
<ul>
<li v-for="li in newlis">{{li.title}}---{{li.age}}</li>
</ul>
</div>
</body>
</html>
<script>
var lis=[
{title:"曾强",age:20},
{title:"皇冠",age:21},
{title:"鹏飞",age:22},
{title:"鱼尾",age:23}
]
var app=new Vue({
el:"#app",
data:{
info:100,
lis:lis
},
computed:{
newinfo:function(){
return this.info=this.info+"美元";
},
newlis:function(){
return this.lis.reverse();
}
}
})
</script>
MethodsOption
<body>
<div id="app">
{{info}}
<br>
<button @click="add(2,$event)">添加</button>
<br>
<btn @click.native="add(3)"></btn>
</div>
<!-- 外部调用构造器的方法 -->
<button onclick="app.add(10)">添加</button>
</body>
</html>
<script>
var btn={
template:`<button>添加组件</button>`
}
var app=new Vue({
el:"#app",
data:{
info:1
},
components:{
"btn":btn
},
methods:{
add:function(num){
this.info=this.info+num;
}
}
})
</script>
watchOption
<body>
<div id="app">
{{msg}}--{{num}}
<br>
<button @click="add">加温</button><br>
<button @click="delet">减温</button><br>
</div>
</body>
</html>
<script>
var lis=["冷","普通","热"];
var app=new Vue({
el:"#app",
data:{
num:0,
msg:lis[0]
},
methods:{
add:function(){
this.num++;
},
delet:function(){
this.num--;
}
},
watch:{
num:function(newValue,oldValue){
if(newValue>=10){
this.msg=lis[0];
}else if(newValue>5&&newValue<10){
this.msg=lis[1];
}else{
this.msg=lis[2];
}
}
}
})
</script>
mixinsOption
<body>
<div id="app">
{{num}}
<br>
<button @click="add">加温</button><br>
</div>
</body>
</html>
<script>
Vue.mixin({
updated:function(){
console.log("全局混入");
}
});
var addLog={
updated:function(){
console.log("内部混入");
}
}
var app=new Vue({
el:"#app",
data:{
num:0,
},
methods:{
add:function(){
this.num++;
}
},
mixins:[addLog],
updated:function(){
console.log("内部生命周期");
}
})
</script>
输出:
全局混入
内部混入
内部生命周期
extendsOption
<body>
<div id="app">
{{num}}
<br>
<button @click="add">加温</button><br>
</div>
</body>
</html>
<script>
var extendObj={
updated:function(){
console.log("扩展生命周期");
},
add:function(){
console.log("扩展方法")
this.num++;
}
}
var app=new Vue({
el:"#app",
data:{
num:0,
},
methods:{
add:function(){
console.log("原生方法");
this.num++;
}
},
extends:extendObj,
updated:function(){
console.log("内部生命周期");
}
})
</script>
输出:
原生方法
扩展生命周期
内部生命周期
替换插入符号
<body>
<div id="app">
${num}
</div>
</body>
</html>
<script>
var app=new Vue({
el:"#app",
data:{
num:0,
},
delimiters:["${","}"]
})
</script>
第四节(实例和内置组件)
rumen
<body>
<div id="app">
{{num}}
<br>
<button @click="add">增加</button>
</div>
</body>
</html>
<script>
var app=new Vue({
el:"#app",
data:{
num:0,
},
methods:{
add:function(){
this.num++;
}
},
mounted:function(){
$("#app").html("Hello Jquery!");
}
});
app.add();
</script>
exampleMethod
<body>
<div id="app">
{{num}}
</div>
<button onclick="add()">增加</button>
<button onclick="des()">销毁</button>
<button onclick="tick()">更改数据</button>
<button onclick="upda()">重新加载数据</button>
</body>
</html>
<script>
var info = Vue.extend({
template: `<p>{{msg}}</p>`,
data: function () {
return {
msg: 1
}
},
mounted:function(){
//在挂载时候执行
console.log("被挂载");
},
updated:function(){
console.log("被更新");
},
destroyed:function(){
console.log("被销毁")
},
});
var vm = new info().$mount("#app");
//会执行updated
function add() {
vm.msg++;
}
//会执行destroyed
function des() {
vm.$destroy();
}
//重新加载数据,还是会调用updated钩子函数
function upda(){
vm.$forceUpdate();
}
//updated和内部的nextTick的回调都执行
function tick(){
vm.msg=10;
vm.$nextTick(function(){
console.log("msg更新完毕之后调用");
})
}
</script>
exampleEvent(实例事件)
基本案例:
<body>
<div id="app">
{{num}}
<br>
</div>
<button onclick="addc()">加</button>
<button onclick="offc()">关闭事件</button>
<button onclick="oncec()">加一次</button>
</body>
</html>
<script>
var app=new Vue({
el:"#app",
data:{
num:1
}
});
app.$once("once",function(){
console.log("只执行一次");
this.num++;
});
app.$on("add",function(){
this.num++;
})
function addc(){
app.$emit("add");
}
function offc(){
app.$off("add");
}
function oncec(){
app.$emit("once");
}
</script>
slot
<body>
<div id="app">
<zengqiang><span slot="info">{{info}}</span></zengqiang>
</div>
</body>
<template id="tm">
<div>
<a><slot name="info"></slot></a>
</div>
</template>
</html>
<script>
var el={
template:"#tm"
}
var app=new Vue({
el:"#app",
data:{
info:"数据信息"
},
components:{
"zengqiang":el
}
});
</script>
虚拟DOM存在的优势
窥探Vue.js 2.0 - Virtual DOM到底是个什么鬼?