In Vue.js version 3.5, you can make a Vue component work with v-model
using the defineModel
macro. For example:
<!-- BaseInput.vue --> <script setup> const value = defineModel(); </script> <template> <input type="text" v-model="value" /> </template> <!-- App.vue --> <script setup> import { ref } from "vue"; import BaseInput from "./components/BaseInput.vue"; const value = ref(""); </script> <template> <BaseInput v-model="value" /> </template>
In Vue.js versions below 3.5, the defineModel
macro does not exist. Instead, you can use the modelValue
prop to receive the v-model
value, and emit the update:modelValue
event to update it.
<!-- BaseInput.vue --> <script setup> const props = defineProps(["modelValue"]); const emit = defineEmits(["update:modelValue"]); </script> <template> <input type="text" :value="props.modelValue" @input="emit('update:modelValue', $event.target.value)" /> </template> <!-- App.vue --> <script setup> import { ref } from "vue"; import BaseInput from "./components/BaseInput.vue"; const value = ref(""); </script> <template> <BaseInput v-model="value" /> </template>
Alternatively, you can use a computed property, where the getter returns props.modelValue
, and the setter emits the update:modelValue
event.
<!-- BaseInput.vue --> <script setup> import { computed } from "vue"; const props = defineProps(["modelValue"]); const emit = defineEmits(["update:modelValue"]); const value = computed({ get: () => props.modelValue, set: (newValue) => emit("update:modelValue", newValue), }); </script> <template> <input type="text" v-model="value" /> </template> <!-- App.vue --> <script setup> import { ref } from "vue"; import BaseInput from "./components/BaseInput.vue"; const value = ref(""); </script> <template> <BaseInput v-model="value" /> </template>
Top comments (0)