昨天鐵人賽做完了新增ticket
!所以現在專案裡,Done
欄位完成了三張票~
不過,在繼續實作編輯
及刪除
ticket功能之前,昨天的完成品有個地方我還不太滿意:
我想要讓輸入框先不要顯示在畫面上,等到使用者按+
之後才出現~拿~個~輸入框
這樣的功能該如何實作呢?
v-if
今天想來介紹v-if
和v-show
,先來看簡單的範例:
v-if
Eg. 去電影院時,身高小於120公分的小孩可以用半票價格,其他人都是全票價格
template
<div id="app">
<span v-if="height > 120">全票</span>
<span v-else>半票</span>
</div>
js
new Vue({
el: "#app",
data: {
height: 100
}
})
html
半票
v-show
常常與v-if
拿來比較:
<div id="app">
<span v-show="height > 120">全票</span>
</div>
如果不符合條件的話,html裡面什麼都不會顯示,但是按右鍵看網頁元素,原始的欄位透過display: none
被隱藏了:
v-show
的差別,在於v-show
只是更改css,使用<span style="display: none;"></span>
,只是讓判斷邏輯未通過的部分不在螢幕上顯示,因此效能較佳。(v-show
跟v-else
不能同時使用喔!)
參考Vue官網比較v-if
與v-show
的說明:
v-if 是“真正”的條件渲染,因為它會確保在切換過程中條件塊內的事件監聽器和子組件適當地被銷毀和重建。
v-if也是惰性的:如果在初始渲染時條件為假,則什麼也不做——直到條件第一次變為真時,才會開始渲染條件塊。
v-show就簡單得多——不管初始條件是什麼,元素總是會被渲染,並且只是簡單地基於CSS進行切換。
所以我們可以導出結論:
如果資料更動不會太頻繁,而且當條件不符合時,想直接把整個元素的資料從網頁上拿掉、不採用display-none
藏起來就的話,用v-if
較好。
昨天的功能,我想多加幾個v-if
的邏輯判斷,並修改一下UI:
if
使用者按下+
按鈕時才出現新增ticket
的輸入框,同時長出取消
按鈕if
使用者按下取消
按鈕,回復成原來的樣子起手式:
+
按鈕和data
綁定data
再加一欄屬性
:addTicket: false
為了幫助思考,畫面設計如下:
接著規劃邏輯步驟:
if 不顯示輸入框(!addTicket
),代表還沒按下新增ticket
按鈕的狀態。
當按下新增ticket
按鈕(@click="addTicket = true"
)時,狀態改為顯示輸入框(addTicket= true
)。按鈕變成建立
按鈕及取消
按鈕
當按下建立ticket
按鈕@click="createCard"
時,把輸入框的資料打到後端
當按下取消
按鈕@click="addTicket = false"
時,回到1.
最後,在元件裡撰寫邏輯:
html
column.vue 元件
<div class="ticket-input">
<button v-if="!addTicket" class="create-ticket-btn" @click="addTicket=true"><i class="fas fa-plus text-teal-100"></i></button>
<input v-if="addTicket" class="ticket-name" v-model="ticketname"></input>
<button v-if="addTicket" class="create-ticket-btn" @click="createTicket">建立</button>
<button v-if="addTicket" class="cancel-ticket-btn" @click="addTicket=false">取消</button>
</div>
data: function () {
return {
tickets: this.column.tickets,
ticketname: '',
addTicket: false
}
}
methods: {
createTicket(evt){
evt.preventDefault();
console.log(this.ticketname)
let data = new FormData();
data.append("ticket[column_id]", this.column.id);
data.append("ticket[name]", this.ticketname);
Rails.ajax({
// 略
});
// 新增ticket完畢後,把`addTicket`的開關,關掉
this.addTicket = false
},
新增ticket
的流程控制,設計完成!
明天也會用到v-if
來編輯ticket唷~
Ref: