当前位置: 首页 > news >正文

Vue3实战笔记(56)—实战:DefineModel的使用方法细节

文章目录

  • 前言
  • 一、实战DefineModel
  • 二、思考原理
  • 总结


前言

今天写个小例子,实战DefineModel的使用方法细节


一、实战DefineModel

上文官方说的挺清楚,实战验证一下,新建DefineModel.vue(这是儿子):


<template><div><div>parent bound v-model is: {{ model }}</div><v-btn @click="update" color="light-green">点我更新儿子</v-btn></div>
</template><script setup lang="ts" name="">
const model:any = defineModel()function update() {model.value++
}
</script><style lang='scss' scoped>
</style>

再更改一下之前的about.vue测试(这是父亲):


<template><div><h3>About</h3><h3>姓名:{{userStore.name}}</h3><h3>简介:{{profile}}</h3><h3>年龄:{{age}}</h3><DefineModel v-model="age" /><v-btn @click="update" color="red" class="mt-3">点我更新父亲</v-btn></div>  </template><script setup lang='ts' name="About">
function update(){age.value++
}
const age = ref(1);
import DefineModel from './study/defineModel.vue';
import { ref } from 'vue';</script><style lang='less' scoped>
</style>

运行:
在这里插入图片描述
点击父和子组件的按钮更新值age都会变化:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、思考原理

为什么

const model = defineModel()

就绑定到了父的v-model了呢,因为defineModel 是一个便利宏。编译器将其展开为以下内容:

一个名为 modelValue 的 prop,本地 ref 的值与其同步;

一个名为 update:modelValue 的事件,当本地 ref 的值发生变更时触发。

在 3.4 版本之前,你一般会按照如下的方式来实现上述相同的子组件:


<script setup>
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
</script><template><input:value="props.modelValue"@input="emit('update:modelValue', $event.target.value)"/>
</template>

这也是刚刚断点时候这个属性的解释:
在这里插入图片描述
但是注意我们子组件属性的名字是随意的,例如:

const childage:any = defineModel()

那么:


<template><div><h3>parent bound v-model is: {{ childage }}</h3><v-btn @click="update" color="light-green">点我更新儿子</v-btn></div>
</template><script setup lang="ts" name="">
const childage:any = defineModel()function update() {childage.value++
}
</script><style lang='scss' scoped>
</style>

运行:

在这里插入图片描述
是不影响功能的。我开始对这里理解有点误解,备忘。

如果不想用默认的modelValue,也可以传递一个有意义的名字:

父:


<DefineModel v-model:childage="age" />

儿砸:


const childage:any = defineModel('childage')

在这里插入图片描述


总结

这样一来,通过 defineModel,子组件无需显式声明 props 和 emits,就能实现与父组件之间的自动双向绑定。

草长莺飞二月天,拂堤杨柳醉春烟 儿童散学归来早,忙趁东风放纸鸢

相关文章:

  • 设置密码重要性!美国一配件制造商因忘设密码影响50 多万客户
  • 百度/迅雷/夸克,网盘免费加速,已破!
  • Docker|了解容器镜像层(1)
  • 30、matlab现代滤波:维纳滤波/LMS算法滤波/小波变换滤波
  • STM32—按键控制LED(定时器)
  • 根据模板和git commit自动生成日·周·月·季报
  • ALSA 用例配置
  • Dokcer 基础使用 (4) 网络管理
  • C# 泛型函数
  • 毕业论文word常见问题
  • ElementUI中date-picker组件,怎么把大写月份改为阿拉伯数字月份(例如:一月、二月,改为1月、2月)
  • 【全开源】JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码
  • 为Android组件化项目搭建Maven私服
  • 洛谷 P1253 扶苏的问题 题解 线段树
  • 爬虫案例:有道翻译python逆向
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • Android Studio:GIT提交项目到远程仓库
  • avalon2.2的VM生成过程
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • js作用域和this的理解
  • Promise面试题,控制异步流程
  • Python十分钟制作属于你自己的个性logo
  • Spring Boot MyBatis配置多种数据库
  • WebSocket使用
  • zookeeper系列(七)实战分布式命名服务
  • 基于web的全景—— Pannellum小试
  • 简单易用的leetcode开发测试工具(npm)
  • 聊聊redis的数据结构的应用
  • 你不可错过的前端面试题(一)
  • 前端技术周刊 2019-02-11 Serverless
  • 微信支付JSAPI,实测!终极方案
  • 问题之ssh中Host key verification failed的解决
  • 【干货分享】dos命令大全
  • ionic入门之数据绑定显示-1
  • k8s使用glusterfs实现动态持久化存储
  • # Kafka_深入探秘者(2):kafka 生产者
  • # SpringBoot 如何让指定的Bean先加载
  • #QT(TCP网络编程-服务端)
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C++)八皇后问题
  • (function(){})()的分步解析
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (六)vue-router+UI组件库
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (十五)使用Nexus创建Maven私服
  • (图)IntelliTrace Tools 跟踪云端程序
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)linux下的时间函数使用
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)