vue3?封裝自定義組件v-model的示例
首先要注意 vue3中 v-model 默認(rèn)綁定的變量名變了,從原理的 value 改成了 modelValue,
如果要改變變量的值,要執(zhí)行一個(gè)事件 this.$emit("update:modelValue", value);


<template>
<div class="inline">
<input :type="password ? 'password' : 'text'" ref="input" @input="handleInput" @blur="handleBlur($event.target.value)" :placeholder="placeholder" />
</div>
</template>
<script>
export default {
name: "dg-Input",
props: {
type: {
type: String,
requided: true,
},
placeholder: {
type: String,
},
password: {
default: false,
},
modelValue: [String, Number],
},
data() {
return {};
},
computed: {
nativeInputValue() {
return this.modelValue === null || this.modelValue === undefined ? "" : String(this.modelValue);
},
},
methods: {
handleInput(event) {
let value = event.target.value;
this.$emit("update:modelValue", value);
this.$emit("input", value);
this.$nextTick(this.setNativeInputValue);
},
setNativeInputValue() {
const input = this.$refs.input;
if (input.value === this.nativeInputValue) return;
input.value = this.nativeInputValue;
},
},
mounted() {
this.setNativeInputValue();
},
};
</script>
<style lang="scss" scoped>
.inline {
display: inline-block;
input {
width: 100%;
height: 100%;
padding-left: 5px;
}
}
</style>
補(bǔ)充:下面看下vue3中自定義組件使用v-model
vue2 中的v-model
v-model本質(zhì)上是一個(gè)語法糖,如下代碼
<input v-model="test"> <!--上面代碼本質(zhì)上就是下方代碼--> <input :value="test" @input="test = $event.target.value">
因此,對(duì)于一個(gè)帶有 v-model 的組件(核心用法),它應(yīng)該如下:
帶有v-model的父組件通過綁定的value值(即v-model的綁定值)傳給子組件,子組件通過 prop接收一個(gè) value;
子組件利用oninput事件實(shí)時(shí)通過 $emit 觸發(fā)父組件input 事件,并傳入新值value給父組件;
父組件
<template>
<div>
<child v-model="msg" @input="msg = $event.target.value" />
<!--<child :value="msg" @input="msg = $event.target.value" />-->
</div>
</template>
<script>
import child from './components/Child.vue'
export default {
components: {
child
},
data() {
return {
msg: ''
}
}
}
</script>子組件child
<template>
<input type="text" :value="modelValue" @input="handleInput">
</template>
<script>
export default {
name: 'Child',
props:['value'],
data() {
return {
modelValue: this.value
}
},
methods: {
handleInput(event) {
this.$emit('input', event)
}
}
}
vue3中的 v-model
vue3中的v-model默認(rèn)綁定的不是value,而是modelValue,接收的方法由input改為@update:modelValue。
<template>
<child v-model="msg" />
<p>{{msg}}</p>
</template>
<script lang="ts">
import { defineComponent,ref} from 'vue';
import child from './components/child/index.vue'
export default defineComponent({
name: 'App',
components:{
child
},
setup(){
const msg = ref('1')
return{
msg
}
}
});
</script>
<template>
<input type="text" :value="modelValue" @input="onInput">
</template>
<script lang="ts">
import {defineComponent} from 'vue'
export default defineComponent({
name:'ChildInput',
props:{
modelValue:{
type:String
}
},
setup(props, context){
const onInput = (e: Event) =>{
context.emit('update:modelValue',e.target.value)
}
return{
onInput
}
}
})
</script>到此這篇關(guān)于vue3 封裝自定義組件v-model的文章就介紹到這了,更多相關(guān)vue3 自定義組件v-model內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue中eslint導(dǎo)致的報(bào)錯(cuò)問題及解決
這篇文章主要介紹了vue中eslint導(dǎo)致的報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
vue實(shí)現(xiàn)全局組件自動(dòng)注冊(cè),無需再單獨(dú)引用
這篇文章主要介紹了vue實(shí)現(xiàn)全局組件自動(dòng)注冊(cè),無需再單獨(dú)引用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Vue.js樣式動(dòng)態(tài)綁定實(shí)現(xiàn)小結(jié)
這篇文章主要介紹了Vue.js樣式動(dòng)態(tài)綁定實(shí)現(xiàn)小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01
發(fā)布訂閱模式在vue中的實(shí)際運(yùn)用實(shí)例詳解
訂閱發(fā)布模式定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)訂閱者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象。這篇文章主要介紹了發(fā)布訂閱模式在vue中的實(shí)際運(yùn)用,需要的朋友可以參考下2019-06-06
Vue使用輪詢定時(shí)發(fā)送請(qǐng)求代碼
這篇文章主要介紹了Vue使用輪詢定時(shí)發(fā)送請(qǐng)求代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08
vue實(shí)現(xiàn)input輸入模糊查詢的三種方式
本文主要介紹了vue實(shí)現(xiàn)input輸入模糊查詢的三種方式嗎,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Vue使用vm.$set()解決對(duì)象新增屬性不能響應(yīng)的問題
這篇文章主要介紹了Vue使用vm.$set()解決對(duì)象新增屬性不能響應(yīng)的問題,為了解決這個(gè)問題,Vue提供了一個(gè)特殊的方法vm.$set(object, propertyName, value),也可以使用全局的Vue.set(object, propertyName, value)方法,需要的朋友可以參考下2023-05-05
Element?Plus的el-tree-select組件懶加載+數(shù)據(jù)回顯詳解
el-tree-select組件是el-tree和el-select的結(jié)合體,他們的原始屬性未被更改,下面這篇文章主要給大家介紹了關(guān)于Element?Plus的el-tree-select組件懶加載+數(shù)據(jù)回顯的相關(guān)資料,需要的朋友可以參考下2022-11-11

