在vue中,官方提供了一个 v-model 的api,可以很方便实现数据双向绑定
解析一下v-model
当v-model用在html标签上的时候,是这样的
<input type="text" v-model="username" />
实现原理是这样的
<input type="text" :value="username" @input="username = $event.target.value" />
当v-model用在组件标签上,原理是这样的 (vue3默认是modelValue)
<XInput :modelValue="username" @update:modelValue="username = $event"/>
// XInput组件
<template>
<input
type="text"
:value="modelValue"
@input="emit('update:modelValue',(<HTMLInputElement>$event.target).value)"
/>
</template>
<script setup lang="ts" name="XInput">
defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
</script>
如果要更改modelvalue属性值为name,可以在用的地方这样。同时这里也就可以写多个v-model,命名不一样就行
// 这里更改后同理下面的字组件也要改成name
<XInput v-model:name="username"/>
// XInput组件
<template>
<input
type="text"
:value="name"
@input="emit('update:name',(<HTMLInputElement>$event.target).value)"
/>
</template>
<script setup lang="ts" name="XInput">
defineProps(['name'])
const emit = defineEmits(['update:name'])
</script>