[Vue學習筆記](三)Vue指令(上) — v-text, v-html, v-if, v-show, v-for

Andy Cheng
Andy的趣味程式練功坊
7 min readMay 2, 2019

指令是vue中的精髓,透過指令我們可以更方便去操作頁面中的元素,在本篇將會介紹基本vue的指令, v-text, v-html, v-if, v-show, v-for的使用方法。

ㄧ、基本指令

(一) v-text / v-html

  • v-text

v-text用來「直接」顯示data中資料的內容,與內插{{}}的功能是ㄧ樣的,只不過v-text會更新整塊標籤的內容(包含本身),而{{}}則能更新標籤內的局部內容,這邊比較複雜,透過下面範例可以看到差別。

  • v-html

v-html與v-text的差別是,v-text是將內容原封不動地顯示出來,v-html則是可以渲染文本中Html的內容。但我們會盡量避免使用v-html,因為如果使用者將v-html的內容改成js的檔案,就能藉而去操作系統的資料,可能會帶來XSS攻擊。

如下列程式碼,我們新增了三種標籤,v-html,v-text和內插表示。

上面可以看到,

  • v-html將note的內容直接渲染出來
  • v-text將note的內容原封不動顯示出來,並直接忽略<i>標籤
  • {{}}與v-text不同的是,他有保留<i>標籤,因此字體為斜體

(二) v-cloak

v-cloak算是一個讓用戶體驗更好的指令,當我們網路很慢時,或者頁面加載完畢但沒有初始化得到 vue 實例時,DOM中的{{}}會顯示出來,這樣就很難看了,因此v-cloak + css能幫助我們在Vue實例化之前先給元素新增一個樣式,常常會使用none這個樣式。

<div id="app" v-cloak>
{{ message }}
</div>
<script>
var app = new Vue({
el:'#app',
data:{
message: 'HelloWorld'
}
</script>

這樣我們就加上了v-cloak指令,但其實尚未有任何作用,此時只要增加一句CSS就可以解決這個問題。

[v-cloak]{
display: none;
}

如此一來,在Vue尚未被實例化之前,#app這塊區域並不會顯示出來。

(三) v-once

v-once與v-cloakㄧ樣都不需要運算式,功能是:

加了v-once的元素、標籤或節點只會被渲染一次,之後就變成靜態內容,並不會隨著data的變動而改變。

<div id="app" v-once>
{{ message }}
</div>
<script>
var app = new Vue({
el:'#app',
data:{
message: 'HelloWorld'
}
</script>

二、 條件繪製指令

(ㄧ)v-if , v-else-if, v-else

Vue的條件指令可以根據運算式的值在DOM中繪製或銷毀元素,例如:

<div id="app">
<p v-if="status === 1">當status為1時顯示此行</p>
<p v-else-if="status === 2">當status為2時顯示此行</p>
<p v-else>否則顯示這行</p>
</div>
<script>
var app = new Vue({
el:'#app',
data:{
status: 1
}
</script>

由於data中的status為1,所以只會顯示「當status為1時顯示此行」這段訊息。

v-if = “JS運算式”,雙引號的內部是放js的運算式,可以放入:

  • status > 1
  • status < 1
  • status != 1

等等運算式,使用方法很直覺就不多敘述,值得注意的是,若v-if裡面的內容有很多行,則可以添加vue內建的標籤template來使用:

則顯示:

(二)v-show

v-show的功能跟v-if很相似,不過它是改變元素的CSS的display屬性,當v-show的值為false,元素則會隱藏,檢視DOM結構會看到元素上嵌入了display:none;

例如下列程式碼:

<div id="app">
<p v-show="status === 1">當status為1時顯示此行</p>
</div>
<script>
var app = new Vue({
el:'#app',
data:{
status: 2
}
</script>

結果為:

<p style="display: none;"> 當status為1時顯示此行</p>

v-if vs v-show

雖然這兩者的功能類似,但v-if才是真正的條件繪製,它會真的去銷毀或重建元素及綁定的事件,如果運算式為false,一開始元素就不會被繪製,但v-show都會將元素編譯,只是加了CSS的屬性。

使用時機:

  • 如果元件會頻繁被切換-> v-show
  • 不經常變換的場景-> v-if (負擔較大)

三、 清單指令 v-for

v-for能將一個陣列或物件的每個元素做循環顯示,可以結合in來使用:

(一)v-for 渲染陣列

<div id="app">
<ul>
<li v-for="(val,key) in arr">{{val}}---{{key}}</li>
</ul>
</div>
<script>
var app = new Vue({
el:'#app',
data:{
arr: ['a', 'b', 'c']
}});
</script>

結果如下:

語法為

v-for = "(值 , key) in 所屬陣列或物件"

(二)v-for 渲染物件

<div id="app">
<ul>
<li v-for="(val,key) in ">{{val}}---{{key}}</li>
</ul>
</div>
<script>
var app = new Vue({
el:'#app',
data:{
obj: { id: 1, name: 'Jessica', sex: 'F' }
}});
</script>

(三)渲染物件+陣列

這個用法比較常使用,渲染一個物件陣列中的所有物件。

<div id="app">
<ul>
<li v-for="(brand,key) in brands">{{brand.name}}---{{key}}</li>
</ul>
</div>
<script>
var app = new Vue({
el:'#app',
data:{
brands:[ { name: 'addidas'},
{ name: 'nike'},
{ name: 'nubalance' }]
}
});
</script>

本篇文章就介紹到這邊,下一篇文章會介紹稍微難一點的Vue指令,也是比較重要的指令,大家加油~

我是Andy,謝謝你看完這篇文章,如果文章有幫助到你的話,希望不吝於幫我拍手 🙌🙌

--

--

Andy Cheng
Andy的趣味程式練功坊

若能將學到的知識轉化為易懂的文章,才能算是真正學會。這是我創建這個帳號的初衷。