1、插值表达式(mastach语法)、v-text、v-html、v-cloak
<style>
[v-cloak] {
display: none;
}
</style>
<body>
<!--{{}} 这个是插值表达式,使用v-cloak,再给定一个display:none,可以解决在F12-Network-slow3G 下{{}}出现闪烁的问题-->
<div id="app">
<p v-cloak>{{msg}}</p>
<!--v-text 后面跟data,可以不使用插值表达式 同时v-text是没有闪烁的问题的-->
<!--v-text会覆盖元素中原本的内容,但是插值表达式 只会替换自己的占位符,不会把 整个元素的内容全部清空-->
<h4 v-text="msg2"></h4>
<div v-html="msg2"></div>
<!--v-bind: 是Vue中提供的用于绑定属性的命令-->
<input type="button" value="按钮" v-bind:title="mytitle" v-on:click="show1">
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
msg: "123",
msg2:"<h1>这是一个很大的h1</h1>",
mytitle:"这是一个自己定义的title"
},
methods: {
show1:function () {
alert("Hello")
}
}
})
</script>
脚下留心
插值表达式{{}}和v-text,v-html,v-cloak的区别
- {{}}大括号的方法叫做插值法,也就是Mustache读作mastchi,这是最常用的。插值表达式是Vue中最普遍的写法,用法。插值表达式 只会替换自己的占位符,不会把 整个元素的内容全部清空
- v-text后面跟data,直接给属性,是没有闪烁的问题会覆盖元素中原本的内容,但是插值表达式 只会替换自己的占位符,不会把 整个元素的内容全部清空。v-text用的不是特别灵活
- v-html:相当于带标签的,但是服务器有时候直接给我们返回带标签的数据,如果我们想要展示的话,会带标签,我们不要标签,直接用v-html,去掉标签进行解析v-html=""
- v-cloak +插值表达式{{}}的写法,会有闪烁问题,直接给【v-cloak】一个display:none 就好了
2、v-bind和v-on的用法
-
v-bind是Vue提供的属性绑定机制,简写为 :
常见的情况是,src属性,如果直接给src一个图片的链接地址,那么会把src后面的当成一个字符串处理。
<div id="app"> <input type="text" v-model="msg"> <p>Hello{{msg}}</p> <img src="imgUrl" alt=""></div>//这种会当做字符串处理,想要引用,必须使用v-bind属性绑定机制 <img :src="imgUrl" alt=""></div> <script> const vm = new Vue({ el: '#app', data: { msg: 'Vue...', imgUrl: 'https://pics1.baidu.com/feed/e824b899a9014c08235e06b0789f460d7af4f4a3.jpeg?token=b81b371198390d35dfca4c7701405c49&s=B481B557D08F5EEE084DB46B03003070' } }) </script> -
v-on是Vue提供的事件绑定机制,常见的有click,dbclick,mouseover,mouseout,mouseenter,mouseleave等;但是要在后面加一个methods 可以参考下面代码块
<body> <div id="app"> <p>{{msg}}</p> <input type="button" value="按钮" v-bind:title="mytitle" v-on:click="show"> </div> <script> var vm = new Vue({ el: "#app", data: { msg: "123" }, methods: { show:function () { alert("Hello") } } }) </script>
3、事件修饰符--.stop、.prevent、.capture 、.self、.once
- .stop:阻止事件冒泡行为:从内到外有多个事件,当你点击最里面的盒子的时候,它的事件会触发,会继续一次冒泡到最外面的盒子的事件,这样的行为叫做冒泡
- .prevent:阻止事件的默认行为:事件本身有一个行为,但是通过点击等事件,还会有其他事件
- .capture:添加事件监听器时使用事件捕获模式
- .self:只触发自己的事件
- .once:数据只能使用一次。直接在想要使用一次的标签里面写上v-once
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>事件修饰符</title>
<script src="lib/vue-2.4.0.js"></script>
<style>
#app {
width: 100%;
height: 100px;
background-color: pink;
}
</style>
</head>
<body>
<div id="app">
<!--stop阻止事件冒泡-->
<!--<div @click="divHanlder">
<input type="button" id="inner" value="inner按钮" @click.stop="btnHanlder">
</div>-->
<!--prevent 阻止事件的默认行为-->
<a href="http://www.baidu.com" @click="linkClick">有问题,先百度</a>
</div>
<script>
var vm =new Vue ({
el:"#app",
data:{},
methods:{
divHanlder(){
console.log("这是出发了div的事件");
},
btnHanlder(){
console.log("这是出发了btn的事件");
},
linkClick (){
console.log("有问题,先百度")
}
}
})
</script>
</body>
</html>
脚下留心
- 注意事件修饰符的位置,修饰谁,就放到哪里
4、v-model 的数据双向绑定
<body>
<div id="app">
<!--v-bind 可以实现属性的绑定,但是绑定数据是单向的,这里可以使用v-model进行数据的双向绑定-->
<h4>{{msg}}</h4>
<input type="text" style="width: 100%;" v-model="msg">
</div>
<script>
var vm=new Vue({
el:"#app",
data:{
msg:"v-model实现数据的双向绑定"
}
})
</script>
脚下留心
- v-bind 可以实现属性的绑定,但是绑定数据是单向的;这里可以使用v-model进行数据的双向绑定
- v-model 后面没有: 号,直接跟的等号来进行数据的双向绑定
- 数据的双向绑定:在V层也可以修改数据,普通的v-bind绑定数据只能通过修改M层的数据才可以修改数据,v-model可以在V层修改数据,同时M层数据也会得到相应的修改,这就是数据的双向绑定
- 注意v-bind 和v-model的区别
案例--简易计算器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>简易计算器</title>
<script src="lib/vue-2.4.0.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-model="n1">
<select v-model="opt">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<input type="text" v-model="n2">
<input type="button" value="=" @click="clac">
<input type="text" v-model="result">
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
n1: 0,
n2: 0,
result: 0,
opt: "-"
},
methods: {
clac() { //计算器算术方法
// 逻辑
switch (this.opt) {
case "+":
this.result=parseInt(this.n1)+parseInt(this.n2)
break;
case "-":
this.result=parseInt(this.n1)-parseInt(this.n2)
break;
case "*":
this.result=parseInt(this.n1)*parseInt(this.n2)
break;
case "/":
this.result=parseInt(this.n1)/parseInt(this.n2)
break;
}
}
}
})
</script>
</body>
</html>
5、Vue中使用样式
使用class样式
- 数组:使用v-bind进行数据绑定,属性需要使用单引号来引起来
- 数组中使用嵌套对象的方式来代替三元表达式,三元表达式代码不易读
- 直接使用对象,属性名可以带引号,也可以不带引号
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Vue中的样式操作-class</title>
<script src="lib/vue-2.4.0.js"></script>
</head>
<style>
.thin {
font-style: italic;
}
.active {
color: red;
}
</style>
<body>
<div id="app">
<!--第一种使用方式,直接传递一个数组,注意:这里的class需要使用v-bind进行单向的数据绑定,下面的:就是使用的v-bind的缩写,数组里面的class需要使用单引号-->
<!--<h1 :class="['thin']">这是一个很大的h1,很大很大,大到你无法想象</h1>-->
<!--在数组中使用对象来带起三元表达式,提高代码的可读性-->
<!--<h1 :class="['thin',{'active':flag}]">这是一个很大的h1,很大很大,大到你无法想象</h1>-->
<!--在为class使用v-bind绑定对象的时候,对象的属性是类名,在这种情况下属性也就是类名,可以带引号,也可以不带引号;属性的值是个标识符-->
<h1 :class="{'thin':true,'active':true}">这是一个很大的h1,很大很大,大到你无法想象</h1>
</div>
<script>
var vm=new Vue ({
el:"#app",
data:{
flag:true
},
methods:{
}
})
</script>
</body>
</html>
使用内联样式
- 直接在元素上通过 :style的形式,书写样式对象
<h1 :style="{'color':'green','font-weight':'700'}">这是一个很大的h1,很大很大,大到你无法想象</h1>
- 将样式对象,定义到data中,并直接引用到 :style中
<h1 :style="objStyle">这是一个很大的h1,很大很大,大到你无法想象</h1>
var vm=new Vue ({
el:"#app",
data:{
objStyle:{'color':'red','font-weight':'400'}
},
methods:{
}
})
- 在 :style中通过数组,引用多个data上的样式对象 这个和上面 :style通过数组引用一个方法一样,只是多增加了对象,对象之间使用逗号隔开
脚下留心
通过数组的方式添加多个对象,不能使用{},需要使用[]
<h1 :style="[objStyle1,objStyle2]">这是一个很大的h1,很大很大,大到你无法想象</h1>
<script>
var vm=new Vue ({
el:"#app",
data:{
objStyle:{'color':'red','font-weight':'400'},
objStyle1:{'color':'red','font-weight':'400'},
objStyle2:{'font-size':"12px"}
},
methods:{
}
})
</script>
5、v-for和key属性
- 循环普通数组
<div id="app">
<p v-for="item in list">{{item}}</p>
</div>
<script>
var vm =new Vue({
el:"#app",
data:{
list:[1,2,3,4,5,6,7,8]
},
methods:{
}
})
</script>
- 循环复杂数组
<div id="app">
<p v-for="usr in list">ID:{{usr.id}}---名字:{{usr.name}}</p>
</div>
<script>
var vm =new Vue({
el:"#app",
data:{
list:[
{id:1,name:"zs1"},
{id:2,name:"zs2"},
{id:3,name:"zs3"},
{id:4,name:"zs4"},
{id:5,name:"zs5"},
{id:6,name:"zs6"},
{id:7,name:"zs7"}
]
},
methods:{
}
})
</script>
- 循环对象
<div id="app">
<p v-for="(val,key,i) in user">值是:{{val}}---键是:{{key}},索引:{{i}}</p>
</div>
<script>
var vm =new Vue ({
el:'#app',
data:{
user:{
id:1,
name:'托尼',
gender:'男'
}
},
methods:{
}
})
</script>
- 迭代数字
<div id="app">
<p v-for="qqq in 10">这是第{{qqq}}次循环</p>
</div>
<script>
var vm =new Vue ({
el:'#app',
data:{
},
methods:{
}
})
</script>
脚下留心
- in 后面可以放普通数组,数组对象,对象,还可以放数字,数字是从1开始的
- v-for 迭代数字的时候,in后面的数字,起始位置是从1开始的,和索引不一样,索引是从0开始的
6、v-if和v-show
- v-if 每次都会删除元素,然后重新创建元素
- v-show 每次不会重新进行DOM的删除和创建操作,只是切换属性,将display设置成none
- v-if 有较高的切换性能;v-show 有较高的初始渲染消耗。如果涉及到元素的频繁切换,最好不要使用v-if,使用v-show
<div id="app">
<!--
v-if 每次都会删除元素,然后重新创建元素
v-show 每次不会重新进行DOM的删除和创建操作,只是切换属性,将display设置成none
v-if 有较高的切换性能,v-show 有较高的初始渲染消耗,如果涉及到元素的频繁切换,最好不要使用v-if,使用v-show
-->
<input type="button" value="toggle" @click="flag=!flag">
<h3 v-if="flag">这是一个v-if控制的元素</h3>
<h3 v-show="flag">这是一个v-show控制的元素</h3>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
flag: true
},
methods: {
// toggle() {
// this.flag = !this.flag
// }
}
})
</script>