当前位置: 代码网 > it编程>前端脚本>Vue.js > Vue3 使用v-model实现父子组件通信的方法(常用在组件封装规范中)

Vue3 使用v-model实现父子组件通信的方法(常用在组件封装规范中)

2024年07月02日 Vue.js 我要评论
历史小剧场历史告诉我们,痞子就算混一辈子,也还是痞子,滑头,最后只能滑自己。长得帅,不能当饭吃。成大器者的唯一要诀,是能吃亏。吃亏就是占便宜,原先我不信,后来我信了,相当靠谱。----《明朝那些事儿》

历史小剧场

历史告诉我们,痞子就算混一辈子,也还是痞子,滑头,最后只能滑自己。长得帅,不能当饭吃。
成大器者的唯一要诀,是能吃亏。
吃亏就是占便宜,原先我不信,后来我信了,相当靠谱。----《明朝那些事儿》

概述

v-mode实现父子组件数据同步原理主要分为:

  • 父组件添加modelvalue绑定数据且传递到子组件,然后绑定@update:modelvalue事件接收子组件传过来的值
  • 子组件内部使用defineprops来接收父组件modelvalue传过来的值,使用defineemits自定义事件修改值然后触发父组件@update绑定的事件

同步单个数据

父组件

<!--  -->
<template>
    <div>
        <!-- v-model用在html上 -->
        <!-- <input type="text" v-model="username"> -->
        <!-- <input type="text" :value="username" @input="username = (<htmlinputelement>$event.target)!.value" /> -->
        <h4>账号: {{ username }}</h4>
        <h4>密码: {{ pwd }}</h4>
        <!-- v-model用在自定义组件上 -->
        <!-- <xinchaoinput v-model:username="username" v-model:pwd="pwd" /> -->
        <xinchaoinput 
        :username="username"
        @update:username="username = $event" />
    </div>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue';
import xinchaoinput from './xinchaoinput.vue';
const username = ref<string>("张三")
const pwd = ref<string>("123131")
watch(username, (oldvalue, newvalue) => {
    console.log(newvalue)
})
</script>
<style lang="scss" scoped>
</style>

子组件

<!--  -->
<template>
    <div>
        <input type="text"
        :value="username"
        @input="emit('update:username', (<htmlinputelement>$event.target)!.value)" />
        <!-- <br>
        <input type="text"
        :value="pwd"
        @input="emit('update:pwd', (<htmlinputelement>$event.target)!.value)" /> -->
    </div>
</template>
<script setup lang="ts">
defineprops(['username', 'pwd'])
const emit = defineemits(['update:username', 'update:pwd'])
</script>
<style lang="scss" scoped>
input {
    border: 2px solid #ccc;
    border-radius: 5px;
    padding: 2px;
    background-color: darkcyan;
    color: white;
}
</style>

同步多个数据

父组件

<!--  -->
<template>
    <div>
        <!-- v-model用在html上 -->
        <!-- <input type="text" v-model="username"> -->
        <!-- <input type="text" :value="username" @input="username = (<htmlinputelement>$event.target)!.value" /> -->
        <h4>账号: {{ username }}</h4>
        <h4>密码: {{ pwd }}</h4>
        <!-- v-model用在自定义组件上 -->
        <xinchaoinput v-model:username="username" v-model:pwd="pwd" />
        <!-- <xinchaoinput 
        :username="username"
        @update:username="username = $event" /> -->
    </div>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue';
import xinchaoinput from './xinchaoinput.vue';
const username = ref<string>("张三")
const pwd = ref<string>("123131")
watch(username, (oldvalue, newvalue) => {
    console.log(newvalue)
})
</script>
<style lang="scss" scoped>
</style>

子组件

<!--  -->
<template>
    <div>
        <input type="text"
        :value="username"
        @input="emit('update:username', (<htmlinputelement>$event.target)!.value)" />
        <br>
        <input type="text"
        :value="pwd"
        @input="emit('update:pwd', (<htmlinputelement>$event.target)!.value)" />
    </div>
</template>
<script setup lang="ts">
defineprops(['username', 'pwd'])
const emit = defineemits(['update:username', 'update:pwd'])
</script>
<style lang="scss" scoped>
input {
    border: 2px solid #ccc;
    border-radius: 5px;
    padding: 2px;
    background-color: darkcyan;
    color: white;
}
</style>

到此这篇关于vue3 使用v-model实现父子组件通信(常用在组件封装规范中)的文章就介绍到这了,更多相关vue3 v-model父子组件通信内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com