Vue学习笔记-自定义组件使用v-model

server/2024/10/11 13:25:29/

拆解实现

父组件

<template><div></div><Son :name="name" @inputChange="inputChange"></Son>{{ name }}
</template><script setup>
import {ref} from 'vue'
import Son from './son2.vue'const name=ref("张三")const inputChange=(value)=>{name.value=value
}
</script><style  scoped></style>

子组件

<template><div><input type="text" :value="name" @input="inputChange"></div>
</template><script setup>
defineProps(['name'])const inputChange=({target:{value}})=>{
emit('inputChange',value)
}
const emit=defineEmits(['inputChange'])</script><style  scoped></style>

 然后进行改造成我们想要的v-model形式

父组件这边

<template><div></div><!-- <Son :name="name" @inputChange="inputChange"></Son> --><Son v-model:aaa="name" age="18"></Son>{{ name }}
</template><script setup>
import {ref} from 'vue'
import Son from './son2.vue'const name=ref("张三")const inputChange=(value)=>{name.value=value
}
</script><style  scoped></style>

注意和之前的父组件内容进行对比

再来到子组件这里

<template><div><!-- <input type="text" :value="name" @input="inputChange"> --><input type="text" :value="aaa" @input="inputChange"></div>
</template><script setup>
// defineProps(['name'])// const emit=defineEmits(['inputChange'])
//v-model必须要使用update:开头
//然后跟上对应的v-model的属性名
const emit=defineEmits(['update:aaa'])
//这个时候defineProps接收的是v-model传过来的值
//注意:v-model传功来的属性和父子传值的属性不能重名//aaa 就是v-model的值
//age 就是 父子传值的属性defineProps(['aaa','age'])const inputChange=({target:{value}})=>{
emit('update:aaa',value),
console.log({target:{value}});
console.log("value",value);
console.log("target",event.target);
//{target:{value}} 解构赋值
console.log(event.target.value===value);
}</script><style  scoped></style>

这样就完成了自定以组件的双向绑定。

其中,有几个需要注意的地方,就是使用defineProps()时,注意区分v-model的值和父子传值的属性。

还有就是那个update:aaa中的update,这里使用update是vue框架官方的写法,如果想要叫其他值,就还需要父组件传递对应的事件@custom-update:myValue="someData = $event",过程也比较繁琐,这里只是说明为什么那里要叫update。在实际的开发中还是使用这种固定命名的比较便于开发。


http://www.ppmy.cn/server/58376.html

相关文章

深入理解 Java 中的 try with resources

一、摘要 try-with-resources是 JDK 7 中引入的一个新的异常处理机制&#xff0c;它能让开发人员不用显式的释放try-catch语句块中使用的资源。 比如&#xff0c;我们以文件资源拷贝为示例&#xff0c;大家所熟悉的try-catch-finally写法如下&#xff1a; public class Reso…

flutter弹窗高度过高,在弹出键盘后布局溢出问题

1.最外层套脚手架控件&#xff1a;Scaffold&#xff0c;设置背景为透明或半透明。目的是将弹出键盘是的高度计算调整交给Scaffold。(直接用SingleChildScrollView仍然会出现布局溢出) 2.使用SingleChildScrollView包裹弹窗布局。 示例&#xff1a; import package:jade/bean/c…

无人机对地面运动目标定位---获取目标的移动方向和速度

目录 一、引子 我们利用单目无人机通过等时间间隔拍照的形式对地面某移动目标进行定位&#xff0c;当前&#xff0c;我们已经获得了每张相片上该目标的三维坐标&#xff0c;并且知道该无人机在飞行过程中拍照的时间间隔&#xff0c;那么我们就可以通过一定的计算&#xff0c;得…

Java中的InetAddress类

InetAddress类是Java标准库中的一个重要类&#xff0c;用于表示互联网协议&#xff08;IP&#xff09;地址。它可以表示IPv4和IPv6地址&#xff0c;提供了用于查找主机名和IP地址的静态方法&#xff0c;以及获取本地主机和远程主机的网络地址信息的功能。本文将深入探讨InetAdd…

使用clion刷leetcode

如何优雅的使用clion刷leetcode 安装插件&#xff1a;LeetCode Editor) 插件配置&#xff1a; 这样我们每打开一个项目&#xff0c;就会创建类似的文件 我们的项目结构&#xff1a; 我们在题解文件中导入头文件myHeader.h并将新建的文件添加到cmakelists.txt文件&#xff0c;…

KBPC2504-ASEMI无人机专用整流桥KBPC2504

编辑&#xff1a;ll KBPC2504-ASEMI无人机专用整流桥KBPC2504 型号&#xff1a;KBPC2504 品牌&#xff1a;ASEMI 封装&#xff1a;KBPC-4 最大重复峰值反向电压&#xff1a;400V 最大正向平均整流电流(Vdss)&#xff1a;25A 功率(Pd)&#xff1a;中小功率 芯片个数&…

枚举类 (enum)

目录 一、为什么要有枚举类&#xff1f; 二、枚举的简介 三、自定义枚举类 四、使用enum关键字 五、注意事项 一、为什么要有枚举类&#xff1f; 假如我们有这样的一个需求&#xff1a;设计季节类&#xff0c;并创建对象。 我们就需要以下操作&#xff0c;创建Season类&…

CSS学习

CSS学习 CSS&#xff08;层叠样式表&#xff09;是网页设计和开发中的重要技术&#xff0c;用于描述HTML或XML文档的样式和布局。掌握CSS不仅能让网页看起来更加美观&#xff0c;还能提高网页的加载速度和可维护性。 一、CSS基础入门 1. CSS简介 CSS是一种用于描述HTML或XM…