Vue中的v-model

86 阅读1分钟

Vue中v-model实际上是一个语法糖

<input v-model="val">
//等同于

//原生中
<input :value="val" @input="val=$event.target.value">

<input type="checkbox" :checked="val" @change="val=$event.target.checked">

//Vue2中
<template>
	<input type="text" :value="value" @input="updateInput">
</template>
<script>
	export default{
    	props:{
          value:String
      },
      methods: {
          updateInput(e){
              this.$emit("input",e.target.value);
          }
      }
    }
</script>

<template>
	<input type="checkbox" :checked="checked" @change="updateInput">
</template>
<script>
	export default{
		props:{
			checked:Boolean
		},
        model:{
			prop:"checked",
			event:"change"
		},
		methods: {
			updateInput(e){
				this.$emit("change",e.target.checked);
			}
		}
	}
</script>

//Vue3中
<template>
  <div>
    <input type="text" :value="val" @input="updateValue">
  </div>
</template>

<script lang="ts">
import { defineComponent, ref } from 'vue';


export default defineComponent({
  props: {
    modelValue: String
  },
  setup(props, context) {
  	const val = ref(props.modelValue || '');
    const updateValue = (e: KeyboardEvent) => {
      const targetValue = (e.target as HTMLInputElement).value;
      val = targetValue;
      context.emit('update:modelValue', targetValue);
    };
    return {
      val
      updateValue
    };
  }
});
</script>