Vue3:v-model实现组件通信

目录

一.性质

1.双向绑定

2.语法糖

3.响应式系统

4.灵活性

5.可配置性

6.多属性绑定

7.修饰符支持

8.defineModel使用

二.使用

1.父组件

2.子组件

三.代码

1.父组件代码

2.子组件代码

四.效果


一.性质

在Vue3中,v-model指令的性质和作用主要体现在其双向数据绑定能力。v-model是Vue.js中一个强大的工具,用于实现表单输入和应用状态之间的同步更新。

1.双向绑定

v-model实现了数据的双向绑定,即当视图中的数据改变时,模型中对应的数据也会更新;反之亦然。

2.语法糖

v-model实际上是:modelValue和@input事件的组合,这种组合简化了开发者的编码工作,使得代码更加简洁易读。

3.响应式系统

通过Vue的响应式系统,v-model能够监听用户输入的变化,并将这些变化反映到应用的状态中,从而实现动态的视图更新。

4.灵活性

v-model不仅限于原生的HTML表单元素,还可以应用于自定义组件,提供了更大的灵活性和可扩展性。

5.可配置性

在Vue3中,v-model的使用变得更加灵活,允许开发者自定义绑定的属性名称和事件,这为处理复杂场景提供了更多可能性。

6.多属性绑定

v-model支持在同一组件上绑定多个属性,这使得组件可以同时与多个数据属性保持同步。

7.修饰符支持

Vue3还引入了修饰符的概念,允许开发者根据需要自定义v-model的行为,例如使用.lazy.number等修饰符来改变绑定的行为。

8.defineModel使用

从Vue 3.4开始,推荐使用defineModel宏来声明双向绑定的prop,这种方式更加直观且易于管理。

二.使用

1.父组件

2.子组件

将接收的value值赋给input元素的value属性,为了呈现数据

给input元素绑定原生input事件,触发input事件时,进而触发update:model-value事件

三.代码

1.父组件代码

复制代码
<template>
    <div class="father">
        <h4>组件</h4>
	    
        <!-- 使用v-model指令 -->
        <input type="text" v-model="name">
        
        <!-- v-model的本质是下面这行代码 -->
        <!-- <input 
        type="text" 
        :value="name" 
        @input="name =(<HTMLInputElement>$event.target).value"> -->


        <!-- 组件标签上使用v-model指令 -->
        <CustomInput v-model="name"/>
        
        <!-- 组件标签上v-model的本质 -->
        <!-- <CustomInput :modelValue="name" @update:model-value="name = $event"/> -->
        
    </div>
</template>

<script setup lang="ts" name="father">
    import { ref } from "vue";
    import CustomInput from "../components/CustomInput.vue";

    let name = ref('zhangsan')
    
 
</script>


<style>
.father{
    background-color: skyblue;
}
h4{
    margin-left: 20px;
    font-size: 20px;
}
input{
    width: 200px;
    height: 40px;
    font-size: 20px;
    margin-left: 20px;
}

</style>

2.子组件代码

复制代码
<template>

    <!--将接收的value值赋给input元素的value属性,目的是:为了呈现数据 -->
    <!--给input元素绑定原生input事件,触发input事件时,进而触发update:model-value事件-->
    <input 
        type="text" 
        :value="modelValue" 
        @input="emit('update:model-value',(<HTMLInputElement>$event.target).value)"
    >
    
</template>

<script setup lang="ts"  name="CustomInput">

    // 接收props
    defineProps(['modelValue'])
    // 声明事件
    const emit = defineEmits(['update:model-value'])

</script>


<style scoped>
input{
    border-width: 2px;
    border-color: orange;
    width: 200;
    height: 40;

}

</style>

四.效果

相关推荐
Polaris_YJH1 分钟前
使用Vue3+Vite+Pinia+elementUI搭建初级企业级项目
前端·javascript·elementui·vue
菜鸟una2 分钟前
【微信小程序+Taro 3+NutUI 3】input (nut-input) 、 textarea (nut-texteare)类型使用避坑
前端·vue.js·微信小程序·小程序·taro
日光倾3 分钟前
【Vue.js 入门笔记】 状态管理器Vuex
vue.js·笔记·flutter
Highcharts.js4 分钟前
如何在构建音频图表中映射到数据?
javascript·信息可视化·音视频·开发文档·highcharts·数据映射
Jiaberrr5 分钟前
小程序setData性能优化指南:避开坑点,让页面丝滑如飞
前端·javascript·vue.js·性能优化·小程序
m0_694845575 分钟前
HandBrake 是什么?视频转码工具使用与服务器部署教程
服务器·前端·pdf·开源·github·音视频
方安乐6 分钟前
react笔记之tanstack
前端·笔记·react.js
学嵌入式的小杨同学9 小时前
从零打造 Linux 终端 MP3 播放器!用 C 语言实现音乐自由
linux·c语言·开发语言·前端·vscode·ci/cd·vim
weixin_425543739 小时前
TRAE CN3.3.25 构建的Electron简易DEMO应用
前端·typescript·electron·vite·nestjs
Mr Xu_10 小时前
【Vue3 + ECharts 实战】正确使用 showLoading、resize 与 dispose 避免内存泄漏
前端·信息可视化·vue·echarts