vue2
vue2 中父子组件数据同步 父→子 子→父 如何实现?
v-model="count"
或者xxx.sync="msg"
v-model 语法糖 完整写法?
:value="count"
和@input="count=$event"
xxx.sync 语法糖 完整写法?
:xxx="msg"
和@update:xxx="msg=$event"
vue3
vue3 中 v-model 语法糖?
:modelValue="count"
和@update:modelValue="count=$event"
vue3 中 v-model:xxx 语法糖?
:xxx="count"
和@update:xxx="count=$event"
vue2举例
在 Vue 2 中,v-model 的使用实际上是语法糖,其背后其实是一个包含 :value 和 @input 的绑定。当我们在父子组件中传参并希望实现双向数据绑定时,我们可以用 v-model 结合自定义事件来实现。下面是一个父子组件传参的例子:
假设我们有一个子组件,它包含一个输入框:
// 子组件 ChildComponent.vue <template> <div> <input type="text" :value="value" @input="updateValue" /> </div> </template> <script> export default { props: ['value'], methods: { updateValue(event) { this.$emit('input', event.target.value); } } } </script>
子组件接收一个 value props。当用户在输入框中输入时,它会发出一个 input 事件并传送新的值。
现在,我们在父组件中使用 v-model 来接收和传递这个值:
// 父组件 ParentComponent.vue <template> <div> <ChildComponent v-model="parentValue" /> </div> </template> <script>` import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentValue: '' } } } </script>
父组件现在使用 v-model 将 parentValue 绑定到子组件上。当输入框的值在子组件中改变时,这个变化会因为子组件的 $emit 而反映在父组件的 parentValue 上,实现了双向数据的绑定。
vue3举例
子组件
<script setup lang="ts"> defineProps<{ modelValue: number }>() const emit = defineEmits<{ (e: 'update:modelValue', count: number): void }>() </script> <template> <div class="-page" @click="emit('update:modelValue', modelValue + 1)"> 子组件{{ modelValue }} </div> </template> <style lang="scss" scoped></style>
父组件
<script setup lang="ts"> import { ref } from 'vue' const count1 = ref(0) </script> <template> <son v-model="count1" /> </template>