本文目前總結的特性如下
1.偵聽屬性和計算屬性
2.class的繫結
3.條件渲染時的注意事項
4.v-if和v-for同時使用的注意事項
5.插槽
6.ref,父元件呼叫子元件的另一種方式
7.<keep-alive>標籤
偵聽屬性和計算屬性
計算屬性computed
假設有A、B兩個變數,B的值依賴於A,B=A的平方
<p>A的值:{{A}}</p>
<p>A的平方:{{B}}</p>
//B的值依賴於A,當A發生改變時B也會改變
computed:{
B(){
//這個方法在A發生改變時會觸發,返回值傳給B
return A*A
}
}
當計算很簡單的時候,可以直接使用{{A*A}}來代替計算屬性。
可是當計算變得邏輯變得複雜時,如果巢狀在template的表示式並不適用於這種方法,而且這樣會使程式碼的可讀性變差,難以維護
而且使用計算屬性是有快取的,只有當A發生改變時,才會再次觸發
watch偵聽屬性
watch的功能computed類似,watch的方法在監聽的屬性改變時觸發
watch:{
A(){
this.B = A*A;
}
}
class的動態修改
當一個元素的樣式需要根據資料來動態改變時,使用:class屬性
<div :class=”{類名:變數}”></div>,類名是否存在取決於變數值是否為真
當元素有多個樣式時:
<div :class=”[`類1`,{`類名2`:變數2}]”>
類名也可以用計算屬性來監聽:
isEnoug為true,class=”cartLeast unEmpty” 否則class=”cartLeast”
<div :class=”classObj”></div>
computed:{
classObj(){
let classArr = [`cartLeast`];
if(this.isEnough){
classArr.push(`unEmpty`);
}
return classArr;
}
}
在引用元件的時候增加class,這是元件child的類名有a,b兩個
<template><div class=”a”></div></template>
<child class=”b”></child>
條件渲染時的注意事項
vue為了高效能渲染,一般會複用已渲染過的標籤。
假如有一個登入框,根據選擇的登入方式切換input,一個是手機登入,一個是郵箱登入。因為vue會複用原來已有的input,所以當你切換到郵箱登入時,input裡還會儲存有手機登入時的內容,這顯然是不符合條件的。
通過在input上新增key可以區別元素
<div class="" v-if="isSeen">
<input type="text" name="" value="" placeholder="enter a" key="a">
</div>
<div class="" v-else>
<input type="text" name="" value="" placeholder="enter b" key="b">
</div>
<div class="" @click="isSeen=!isSeen">
toggle
</div>
data:{
isSeen:true
}
當同時使用v-for和v-if的注意事項
v-for的優先順序是高於v-if的,當只需要渲染滿足一些特點條件的元素時,是很有效的
但是當需要全部渲染時,把v-if放在外面
<div v-if="{{a}}"><div v-for="item in list"></div></div>