表單輸入是開發中非常常見的需求,原始方式通常需要手動使用v-bind
綁定表單元素的值 (value),並透過v-on
綁定input
事件來監聽輸入變化。
然而,當使用v-model
進行雙向綁定時,表單元素的初始的value
、checked
或selected
屬性值會被忽略,取而代之的是由v-model
綁定的數據來控制這些值。
👉 Vue3 Options API - v-model 原理解析 & 拼字階段差異實作連結
Vue Template(未使用 v-model):
<input :value="originValue" @input="onInputChange" type="text">
Vue Template(使用 v-model):
<input v-model="originValue" type="text">
⭐ 特別注意:若需要看到拼字階段(EX:中文注音)
的改變,需要使用原始@input
搭配:value
的方式。v-model
改動的是拼字結束後的結果。對應到原生javaScriptcompositionstart
及compositionend
事件,捕捉拼字階段的開始及結束。
在v-model
綁定的情況下,不論是單行輸入的input
還是多行輸入的textarea
,綁定的都是字串(String)
類型的數據。它們的差異比較如下:
👉 Vue3 Options API input 單行輸入及 textarea 多行輸入實作連結
Vue Template:
<input v-model="msg" type="text">
<textarea v-model="msg" cols="15" rows="5"></textarea>
<p>顯示 v-model 的值: {{ JSON.stringify(msg) }}</p>
<p>顯示 v-model 長度: {{ msg.length }}</p>
當使用v-model
綁定核取方塊或單選按鈕時,默認情況下,核取方塊綁定的是布林值(true
或 false
)。不過,核取方塊可以通過true-value
和false-value
屬性來改變其綁定的自定義值(EX:字串、數字)。單選按鈕則綁定的是其選定的值(EX:字串、數字)。它們的差異如下:
true-value
和false-value
屬性來自定義選中和未選中的值⭐ 如果需要確保表單提交時一定有選取結果,建議使用單選按鈕作為選擇方式。
👉 原生表單單選按鈕跟單個核取方塊的差別實做連結
以下展示關於 Vue v-model 指令搭配單個核取方塊及單選按鈕的用法:
👉 Vue Options API 單選按鈕及單個核取方塊實作連結
Radio Button Vue Template:
<label for="male">男生</label>
<input v-model="gender" id="male" name="gender" type="radio" value="男生">
<label for="feMale">女生</label>
<input v-model="gender" id="feMale" name="gender" type="radio" value="女生">
<p>當前性別:{{ gender }}</p>
Checkbox Button Vue Template(預設寫法):
<label for="isAgree">【 請問你是否同意此條款 】</label>
<input v-model="isAgree" id="isAgree" type="checkbox">
<p>同意與否: {{ isAgree }}</p>
Checkbox Button Template(使用true-value
及false-value
):
<label for="isAgreeString">【 請問你是否同意此條款 】</label>
<input v-model="isAgreeString" true-value="是" false-value="否" id="isAgreeString" type="checkbox">
<p>同意與否: {{ isAgreeString }}</p>
使用 v-model 綁定單選下拉式選單時,可以透過設置一個帶有disabled
屬性的空值選項,來顯示預設提示文字(EX:請選擇)。當使用者選擇其他選項後,該提示文字將不再顯示。
在v-model
綁定的情況下,選擇的值會對應到選項 (option) 中定義的value
屬性。這個值可以是字串、數字。
👉 Vue3 Options API 單選下拉式選單實作連結
HTML:
<label for="fruit-select">今天特賣會水果:</label>
<select v-model="selectValue" name="fruit" id="fruit-selec">
<option disabled value="">請選擇</option>
<option v-for="item in selectOptions" :value="item" :key="item">{{ item }}</option>
</select>
多選下拉式選單與單選下拉式選單的區別在於是否使用了multiple
屬性。
使用v-model
綁定多選下拉式選單和多選核取方塊時,所綁定的值必須是以陣列(Array
的形式呈現,以存儲多個選項的結果。
⭐ 多選下拉式選單與多選核取方塊之間有一個重要的差異:在多選下拉式選單
中,v-model
綁定的陣列元素順序會依據選項在原始陣列中的順序
。而在多選核取方塊中
,v-model
綁定的陣列元素則會按照選取的順序
排列。
👉 Vue Options API 多選下拉式選單及多選核取方塊實作連結
多選下拉式選單 Vue Template:
<label for="skill">選擇你的技能:</label>
<select v-model="selectSkill" multiple name="skill-select" id="skill">
<option v-for="item in options" :key="item" :value="item">{{ item }}</option>
</select>
<p>當前多選下拉式選單:{{ selectSkill }}</p>
多選核取方塊 Vue Template:
<template v-for="item in options">
<label :for="`skill-${item}`">{{ item }}</label>
<input v-model="checkedSkill" type="checkbox" name="skill-checkbox" :id="`skill-${item}`" :value="item">
</template>
<p>當前多選核取方塊:{{ checkedSkill }}</p>
前面提到過v-on 指令
可以搭配修飾符
,這裡將說明v-model 指令
所對應的修飾符
:
v-model
會在每次輸入時通過input 事件
立即更新綁定的數據,而使用.lazy 修飾符
後,數據更新將改為依賴change 事件
。這代表只有當使用者完成輸入並移開鼠標或按下 Enter 鍵後,綁定的v-model
值才會更新。這樣可以減少即時偵測的頻率,適合不需要每次輸入都同步更新的場景。👉 Vue3 Options API v-model lazy 修飾符實作連結
HTML:
<input v-model.lazy="lazyInputValue" id="lazyMsg" type="text">
parseFloat()
函數處理,嘗試將其轉換為數字類型。根據輸入的值,有以下兩種解析結果:v-model.number
不會轉換它,會顯示為原始字串的值及型別(EX:String)。v-model.number
會僅解析出數字部分,例如輸入 100abc,結果會顯示為 100。👉 Vue3 Options API v-model number 修飾符實作連結
HTML:
<input v-model.number="numberInputValue" type="text" id="textInput">
👉 Vue3 Options API v-model trim 修飾符實作連結
HTML:
<input v-model.trim="useTrimValue" type="text" id="textInput">
@input
事件來監聽輸入變化,並使用:value
將輸入的值綁定回輸入框,從而實現雙向數據綁定。單行輸入框 (input)
和多行輸入框 (textarea)
綁定的是字串 (String)
。多選下拉式選單(select)
和多選核取方塊(checkbox)
綁定的是陣列 (Array)
。單選核取方塊 (checkbox)
預設綁定布林值 (Boolean)
。單選核取方塊
使用true-value
和false-value
屬性、單選按鈕 (radio button)
以及單選下拉式選單
則可以綁定多種數據類型
(如字串、數字、物件等)。input
切換為change
,只有在按下 Enter 鍵或移開鼠標時才會更新值,從而減少觸發頻率。NaN
,則會顯示原始值及其類型(如字串)。