之前在學 Vue 2 的時候,稍微釐清 v-model 觀念。但一陣子沒用了,忘了差不多,今天在讀 Vue3 順便來回顧一下之前觀念,順便來筆記一下。
一般 Component
1 2 3 4 5 6 7
| <ChildComponent v-model="pageTitle" />
<!-- 簡寫: -->
<ChildComponent :modelValue="pageTitle" @update:modelValue="pageTitle = $event"
|
重點1(簡寫)
簡單說明
v-model 簡寫 => :modelValue="xxx" @update:modelValue="xxxx"
現在 Vue 3 也可以控制 v-model而外變數
v-model:title
=> :title="xxx" @update:title="xxxx"
重點2(觸發 Event 改變 ModelValue 值)
這邊 @update:modelValue="xxx"
和@update:title="xxxx"
這邊需要知道 Vue 處理 Event 方式,內層 Component 使用 this.$emit('update:modelValue',changeValue)
去做 Event 觸發動作
我們前一篇講到 Component 簡寫,但在 Form(input , textarea …)就不是這樣了。
自己有在官方文件看到寫法。
1 2 3 4 5
| <input v-model="searchText" />
<!-- 簡寫 -->
<input :value="searchText" @input="searchText = $event.target.value" />
|
Form Input Bindings | Vue.js
select
一般 select 寫法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <div id="v-model-select-dynamic" class="demo"> <select v-model="selected"> <option v-for="option in options" :value="option.value"> {{ option.text }} </option> </select> <span>Selected: {{ selected }}</span> </div>
Vue.createApp({ data() { return { selected: 'A', options: [ { text: 'One', value: 'A' }, { text: 'Two', value: 'B' }, { text: 'Three', value: 'C' } ] } } }).mount('#v-model-select-dynamic')
|
checkbox
1 2 3 4 5 6 7 8 9 10
| <!-- `picked` is a string "a" when checked --> <input type="radio" v-model="picked" value="a" />
<!-- `toggle` is either true or false --> <input type="checkbox" v-model="toggle" />
<!-- `selected` is a string "abc" when the first option is selected --> <select v-model="selected"> <option value="abc">ABC</option> </select>
|
true-value,false-value
1
| <input type="checkbox" v-model="toggle" true-value="yes" false-value="no" />
|
true ==> ‘yes’
false ==> ‘false’
補充 v-model 語法糖寫法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| Vue.component('checkbox', { model: { prop: 'checked', event: 'change' }, props: { checked: { type: Boolean, default: false } }, template: ` <input type="checkbox" @input="onInput" @change="onChange"/> `, methods: { onInput (e) { console.log('onInput', e) }, onChange (e) { console.log('onChange', e) this.$emit('change', e.target.checked) } } })
|
注意這邊不是用event.target.value
,是用event.target.checked
。這個問題讓我卡了幾小時的bug 😢😢😢
參考來源:
1 2 3 4
| <input type="radio" v-model="pick" v-bind:value="a" />
// when checked: vm.pick === vm.a
|
select option
1 2 3 4 5 6 7 8
| <select v-model="selected"> <!-- inline object literal --> <option :value="{ number: 123 }">123</option> </select>
// when selected: typeof vm.selected // => 'object' vm.selected.number // => 123
|
- lazy change event 才做改變值動作
- number
1
| <input type="number" v-model.number="xxx" />
|
這邊注意,type沒限定一定要用 number,這邊指令text
的話,純文字(沒打英文)會顯示字串。所以搭配 type 還是最好用 number
做限定。
- trim
只能用在 v-model
Components Basics | Vue.js
相關文章
v-model | Vue3中文文档 - vuejs
自定义事件 | Vue3中文文档 - vuejs
Vue v-model语法糖 - 知乎
v-model之vue2与3的差别 - 知乎