v-model的理解
1、v-model實現原理
2、自定義組件使用v-model
v-model原理
在vue中,對<input>
標籤使用v-model
指令可以實現數據的雙向綁定;其原理是利用<input>
標籤的value
屬性和input
事件;
下面是我們使用v-model的方式:
<input v-model="inputVal" type="text">
<div class="show-panel">{{ inputVal }}</div>
export default {
data() {
return {
inputVal: ''
}
}
}
效果如下:
爲了更好的理解v-model
的原理,我們先模擬v-model
的實現:
利用vue模擬v-model
的實現:
<input :value="inputVal" type="text" @input="inputVal = $event.target.value">
<div class="show-panel">{{ inputVal }}</div>
爲<input>
標籤添加了value
屬性以及input
事件,當我們在輸入內容時,觸發input
事件,將<input>
標籤中的值賦給inputVal
變量。
原生js模擬v-model
的實現
<input id="input" type="text" oninput="handleInput()">
<div class="show-panel"></div>
let inputEle = document.querySelector('#input')
let showPanelEle = document.querySelector('.show-panel')
let inputVal = ''
// 將inputVal的值賦給input標籤的value屬性
inputEle.value = inputVal
function handleInput() {
// 獲取input標籤的value屬性值,並賦給inputVal、showPanelEle
inputVal = inputEle.value
showPanelEle.innerHTML = inputEle.value
}
最開始將inputVal
的值賦給<input>
標籤的value
屬性,當輸入內容時,觸發input
事件,獲取<input>
標籤中最新的value
屬性值,並將輸入值賦給inputVal
變量和showPanelEle
元素。
結合上面v-model
的實現,可以看出v-model
利用了表單元素(<input>
)的value
屬性和input
事件,通過定義一個變量inputVal
,並將inputVal
賦給表單元素的value
屬性,當觸發表單元素的input
事件時將最新的輸入值更新給變量inputval
,進而實現雙向綁定。
自定義組件使用v-model
我們知道表單元素本身具有input
事件,在輸入內容時,可以觸發,但是在vue中,對於自定義組件,當自身沒有input
事件時,還可以使用v-model
嗎?
答案是可以使用的,對於自定義組件,當我們使用v-model
後,組件會自動多了一個value
屬性值和名爲input
的自定義事件(這一切都是vue幫我們實現的),具體如下:
如下是一個HelloWorld.vue
組件:
// HelloWord.vue
<template>
<div>
<h1>{{ value }}</h1>
<button @click="handleClick">點擊更新文本</button>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
value: {
type: String,
default: ''
}
},
methods: {
handleClick() {
this.$emit('input', 'Hi, Vue')
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
我們在使用HelloWorld.vue
組件時候用了v-model
<hello-world v-model="inputVal"></hello-world>
<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
name: 'app',
components: {
HelloWorld
},
data() {
return {
inputVal: 'hello, v-model'
}
}
}
</script>
我們在HelloWorld.vue
中可以獲取一個名爲value
的屬性,當我們需要改變該屬性值時,通過觸發一個名爲input
的自定義事件即可,這就是在自定義組件中使用v-model
的方法。
效果如下:
如果不使用v-model
還想達到相同的效果,我們需要這樣做:
<hello-world :value="inputVal" @input="handleInput"></hello-world>
import HelloWorld from './components/HelloWorld.vue'
export default {
name: 'app',
components: {
HelloWorld
},
data() {
return {
inputVal: 'hello, v-model'
}
},
methods: {
handleInput(val) {
this.inputVal = val
}
}
}
綜上所述,我們可以知道v-model
是一種語法糖,它利用了標籤(表單元素、自定義元素)的value
屬性和input
事件(對於表單元素,input
事件是本身原有的事件,對於自定義組件,input
事件就是一個名爲input
的自定義事件)實現了雙向綁定。
參考文獻:
[1] 表單輸入綁定
[2] Vue之自定義組件的v-model