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>

四.效果

相关推荐
晴天16几秒前
前端跨域方案解析:JSONP 的原理、实战与演进
前端·状态模式
web打印社区2 分钟前
浏览器静默打印?先别装第三个库了
前端·vue.js·chrome·electron·pdf
艾伦野鸽ggg4 分钟前
前端异步请求的状态竞争(请求竞态)问题
前端·javascript·axios
是立不是利9 分钟前
前端交互基石:深入剖析JavaScript三级联动背后的设计哲学
开发语言·前端·javascript
动恰客流统计15 分钟前
传统红外对射客流统计为何逐步淡出主流?准确率与场景限制深度分析
大数据·前端·人工智能
老刘的望远镜17 分钟前
AgentScope Java 从零(03):Agent 的记性默认全开,我在第 50 轮翻了车
java·开发语言·javascript
Rooting++26 分钟前
小程序{{ }}和vue{{ }}语法的区别
前端·vue.js·小程序
软件黑马王子43 分钟前
20.Resources资源加载:基本实现
开发语言·前端框架·c#
前端精髓1 小时前
React 更新 state 中的对象
javascript·react.js·ecmascript
豆约翰1 小时前
css自制图书封面效果
前端·css