vue3的v-model总结

199 阅读1分钟

1.基本用法

子组件 child.vue

<script setup>
import { ref } from 'vue'

let props = defineProps({
    modelValue:{
        type:Number,
        default:0
    }
})

let emit = defineEmits("update:modelValue")

let plusClick = ()=>{
    emit("update:modelValue", props.modelValue + 1)
}

let mineClick = ()=>{
    emit("update:modelValue", props.modelValue - 1)

}


</script>

<template>

  <div>{{ props.modelValue }}</div>
  <button @click="plusClick">+</button>
  <button @click="mineClick">-</button>
  
</template>

<style scoped>



</style>

父组件

<script setup>
import { ref } from 'vue'
import Child from './Child.vue';

let total = ref(0)

</script>

<template>

  <Child v-model="total"></Child>
  <div>total={{ total }}</div>
  
</template>

<style scoped>

</style>

v-model是个语法糖,上面案例中,本质上是:

<Child :modelValue="total" @update:modelValue="newValue => total=newValue"></Child>

多个v-model

子组件child.vue

<script setup>
import { ref } from 'vue'

let props = defineProps({
    age:{
        type:Number,
        default:0
    },
    count:{
        type:Number,
        default:0
    }
})

let emit = defineEmits(["update:age", "update:count"])

let plusClick = ()=>{
    emit("update:age", props.age + 1)
}

let mineClick = ()=>{
    emit("update:age", props.age - 1)

}

let countClick = ()=>{
    emit("update:count", props.count + 1)

}


</script>

<template>

    <div class="contain1">
        <button @click="mineClick">-</button>
        <div>年龄:{{ props.age }}</div>  
        <button @click="plusClick">+</button>
    </div>

    <div class="contain1">
        <div>数量:{{ props.count }}</div>  
        <button @click="countClick">+</button>
    </div>


  
</template>

<style scoped>

.contain1{
    display: flex;
    flex-direction: row;
}

</style>

父组件

<script setup>
import { ref } from 'vue'
import Child from './Child.vue';

let myAge = ref(0)
let count = ref(0)

</script>

<template>

  <Child v-model:age="myAge" v-model:count="count"></Child>
  <div>myAge={{ myAge }}, count={{ count }}</div>


  
</template>

<style scoped>

</style>

这个案例中,v-model本质上是:

<Child :age='myAge' @update:age="newValue => myAge=newValue" 
       :count='count' @update:count="newValue => count=newValue"
></Child>

input上的v-model

<input v-model="text" />

这相当于

<input :value="text" @input="text = $event.target.value" />

其他类型的表单元素的v-model也是类似的语法糖,只是绑定的参数名和事件名不一样