Vue 指令v-bind和v-on
Vue2 指令v-bind和v-on
從這篇文章開始,總結一下Vue中的指令。這篇文章總結v-bind和v-on指令。
(1)v-bind
v-bind的基本用法是動態更新HTML元素上的屬性,如id,class,href,src等。
下面以class為例:
1.v-bind可以用來動態切換class
物件語法
<style>
.left{
color:red;
}
</style>
<body>
<div id="app">
<div v-bind:class="{left:isleft}" >{{message}}</div>
<div v-on:click="change">點選此處改變isleft的值</div>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
message:"你好!",
isleft: true
},
methods: {
change:function(){
if (this.isleft=true){
this.isleft=false;
}else{
this.isleft=true;
}
}
}
})
</script>
</body>
上面的程式碼中,類left存在與否取決於isleft的值,如果isleft的值為true,則類left存在,div中的字型顏色為紅色,渲染結果為:
<div class="left">你好!</ div>
<div>點選此處改變isleft的值</div>
當點選了文字部分之後,isleft的值變為false,類left不再存在,因而此時的“你好!”顏色是黑色,渲染結果為:
<div class>你好!</div>
<div>點選此處改變isleft的值</div>
普通class可以和v-bind:class共存:
<div id="app">
<div class="up" v-bind:class="{left:isleft}">{{message}}</div>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
message:"你好!",
isleft: true
},
})
</script>
渲染之後的結果為:
<div class="up left">你好!</div>
繫結的資料物件也可以定義在data中:
<div id="app">
<div v-bind:class="className">{{message}}</div>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
message:"你好!",
className:{
left:true
},
},
})
</script>
渲染結果為:
<div class="left">你好!</div>
繫結的資料物件還可以是計算屬性:
<div id="app">
<div v-bind:class="className">{{message}}</div>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
message: "你好!",
left: true,
right: false,
up: false,
down: true,
},
computed: {
className: function () {
return {
left: this.left && this.down,
right: this.right && this.up
}
}
}
})
</script>
渲染結果為:
<div class="left">你好!</div>
除了計算屬性,也可以繫結一個類似計算屬性的方法。
陣列語法
我們還可以把一個數組傳給v-bind:class
<div id="app">
<div v-bind:class="[classLeft,classRight]">{{message}}</div>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
message: "你好!",
classLeft:"left",
classRight:"right"
},
})
</script>
渲染結果為:
<div class="left right">你好!</div>
也可以使用三元表示式:
<div id="app">
<div v-bind:class="[is?classLeft:classRight]">{{message}}</div>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
message: "你好!",
is:true,
classLeft:"left",
classRight:"right"
},
})
</script>
渲染結果為:
<div class="left">你好!</div>
可以在陣列語法中使用物件語法:
<div id="app">
<div v-bind:class="[{left:is},classRight]">{{message}}</div>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
message: "你好!",
is: true,
classRight: "right"
},
})
</script>
渲染結果為:
<div class="left right">你好!</div>
2.v-bind可以用來繫結內聯樣式
<div id="app">
<!--物件語法1-->
<div v-bind:style="{color:Color,fontSize:fontSize+'px'}">{{message}}</div>
<!--物件語法2-->
<div v-bind:style="style">{{message}}</div>
<!--陣列語法-->
<div v-bind:style="[style,style1]">{{message}}</div>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
message: "你好!",
Color: "red",
fontSize: 30,
style:{
color:"red",
fontSize:"30px"
},
style1:{
width:"30px",
height:"30px"
}
},
})
</script>
還可以為style繫結一個計算屬性:
<div id="app">
<div v-bind:style="style">{{message}}</div>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
message: "你好!",
},
computed:{
style:function(){
return {
color:"red",
fontSize:"30px"
}
}
}
})
</script>
多重值
可以為 style 繫結中的屬性提供一個包含多個值的陣列,常用於提供多個帶字首的值,例如:
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
這樣寫只會渲染陣列中最後一個被瀏覽器支援的值。在本例中,如果瀏覽器支援不帶瀏覽器字首的 flexbox,那麼就只會渲染 display: flex。
3.v-bind語法糖
Vue.js為v-bind提供了語法糖,也就是縮寫:
<div v-bind:class="a"></div>
<div :class="a"></div>
上面兩種寫法是等價的,也就是說,可以省略v-bind,直接寫:
(2)v-on:
在上一篇文章《Vue 方法與計算屬性》中提到過v-on指令的用法,這裡不再贅述,補充一下前面沒有提到過的。
v-on後面可以加事件修飾符(.)來指出一個指令以特殊的方式繫結。
1.事件修飾符
.stop
.prevent
.capture
.self
.once
.passive
.stop 阻止事件冒泡
<div id="app">
<div v-on:click="do0">
<div v-on:click.stop="do1">點選這裡</div>
</div>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
message: "你好!",
},
methods: {
do0: function () {
console.log("這是外層div")
},
do1: function () {
console.log("這是內層div")
}
}
})
</script>
點選文字部分時,只會觸發do1方法。阻止事件冒泡,不會觸發do0事件。
.prevent 提交時不再過載頁面
<div id="app">
<form v-on:submit.prevent>
<input type="text" name="username" ><br/>
<input type="submit" name="" value="提交">
</form>
</div>
<script>
window.onload = function() {
alert('頁面載入 執行了 window.onload');
};
</script>
.capture 當元素髮生冒泡時,先觸發帶有該修飾符的元素繫結的事件
<div id="app">
<div v-on:click.capture="do0">0
<div v-on:click="do1">1
<div v-on:click="do2">2
</div>
</div>
</div>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
message: "你好!",
},
methods: {
do0: function () {
console.log("0")
},
do1: function () {
console.log("1")
},
do2:function(){
console.log("2")
}
}
})
</script>
當點選了“2”之後,依次輸出:0,2,1。點選了“2”之後先觸發帶有.capture修飾符的元素繫結的事件do0,之後是事件冒泡的過程,由內到外依次觸發do2、do1事件。
更為複雜的例子:
<div id="app">
<div id="a0" v-on:click.capture="doq">a0
<div id="a1" v-on:click="doq">a1
<div id="a2" v-on:click.capture="doq">a2
<div id="a3" v-on:click="doq">a3
<div id="a4" v-on:click="doq">a4
</div>
</div>
</div>
</div>
</div>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
message: "你好!",
},
methods: {
doq: function () {
let id= event.currentTarget.id;
console.log(id);
//a0
//a2
//a4
//a3
//a1
},
}
})
</script>
在點選時,先從外到內觸發具有.capture修飾符的元素上的事件,之後是事件冒泡的過程,也就是剩下的元素的事件由內到外觸發。
上面是點選a4之後輸出的結果:a0、a2、a4、a3、a1
如果點選a3,依次輸出的結果為:a0、a2、a3、a1
如果點選a2,依次輸出的結果為:a0、a2、a1
如果點選a1,依次輸出的結果為:a0、a1
.self 只當事件在該元素本身(而不是子元素)觸發時才執行相應的操作
<div id="app">
<div v-on:click="do1">這是1
<div v-on:click.self="do2">這是2
<div v-on:click="do3">這是3
</div>
</div>
</div>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
message: "你好!",
},
methods: {
do1: function () {
console.log("1")
},
do2: function () {
console.log("2")