vue3第二十节(新增编译宏defineModel)

news2024/11/30 2:40:04

为什么会需要使用defineModel()

注意:defineModel() 需要在3.4及以上版本才可使用;

组件之间通讯,通过 props 和 emits 进行通讯,是单向数据流,比如:props是自上而下的(父组件数据修改导致子组件更新,而自己不能修改父组件传入的 props属性),而emits是自下而上的(子组件通过事件触发父组件事件);

defineModel() 返回的值是一个 ref
它可以像其他 ref 一样被访问以及修改,不过它能起到在父组件和当前变量之间的双向绑定的作用:
defineModel() 实现原理defineModel() 的双向绑定是在编译之后,创建了一个modelref变量以及一个modelValue的props,并且watchprops中的modelValue;当子组件中的modelValue更新时,会触发update:modelValue事件,当父组件接收到这个事件时候,同时更新父组件的变量;
它的 .value 和父组件的 v-model 的值同步;
当它被子组件变更了,会触发父组件绑定的值一起更新

1、defineModel() 的双向绑定:

父组件:

<template>
  <div class="my-define-module">
    This is a defineModel text page.
    // 使用v-model 绑定person对象
    <ChildMy v-model="person"/>
    <hr>
    {{ person.name  }}---{{ person.age }}
  </div>
  </template>
  <script setup>
  import ChildMy from './child.vue'
  import { ref } from 'vue' 
  const person = ref({
    name: 'Andy',
    age: 11
  })
  </script>

子组件

<template>
<div class="my-define-module">
  child -- {{person.name}} // 第一次打印的是父组件传递过来的 Andy
  <el-button type="primary" @click="updatedName">child btn</el-button>
</div>
</template>
<script setup>
import { ref, reactive } from 'vue'
// defineModel() 返回的是一个ref对象
const person = defineModel({
  name: 'child',
  age: 18
})
console.log('==person==child=', person.value)
const updatedName = () => {
  // 子组中更新person 属性,会同时更新父组件的person属性
  person.value.name = `${person.value.name}+$`
  person.value.age = person.value.age + 1
}
</script>

2、defineModel() 创建多个v-model

注意:需要都是基本类型,不能是引用类型,否子组件读到的是undefined
如图:
父组件:

<template>
  <div class="my-define-module">
    This is a defineModel text page.
    <!-- <ChildMy  v-model="person"/> -->
    // 传入多个v-model时的person是Object,导致子组件中person无法通过defineModel获取
    <ChildMy v-model:person="person" v-model:job="job" v-model:num="num"/>
    <hr>
    {{ person.name  }}---{{ person.age }} 
  </div>
  </template>
  <script setup>
  import ChildMy from './child.vue'
  import { ref } from 'vue' 
  const person = ref({
    name: 'Andy',
    age: 11
  })
  // 初始化定义时,当父组件没有传入默认值时候,子组件中的job值不父组件的值不同步,子组件展示的是子组件初始化的值--前端
  const job = ref()
  const num = ref(3)
  </script>

子组件:

  <template>
<div class="my-define-module">
  child -- {{person.name}}
  <hr>
  --job--{{ job }}
  <hr>
  num---{{num}}
  <el-button type="primary" @click="updatedName">child btn</el-button>
  <el-button type="primary" @click="updatedJob">child job</el-button>
  <el-button type="primary" @click="updatednum">child num</el-button>
</div>
</template>
<script setup>
import { ref, reactive } from 'vue'
// defineModel() 返回的是一个ref对象
const person = defineModel({
  name: 'child',
  age: 18,
})
const num = defineModel('num', 2)
const job = defineModel('job', '前端')
console.log('--job---', job) // value => 前端
console.log('--num---', num) // value => 3
console.log('==person==child=', person) // value => undefined
</script>

如图:
请添加图片描述

3、defineModel() 设置额外参数如类型、默认值

const job = defineModel('job', {default: '', type: String, required: true})
编译后的 
props:{
  job:{
    default: '',
    type: String,
    required: true
  }
}

4、defineModel() 添加自定义修饰符:

需要使用数组解构方法获取 model 和 modifiersmodel即为ref对象,modifiers即为修饰符对象
如:
父组件:

<template>
  <div class="my-define-module">
    This is a defineModel text page.
    <ChildMy  v-model.upLow="job"/>
    <hr>
    parents--s{{ job }} // 初始化 5
  </div>
  </template>
  <script setup>
  import ChildMy from './child.vue'
  import { ref } from 'vue' 
  const job = ref(5)
  </script>

子组件:

<template>
<div class="my-define-module">
  <hr>
  --job--{{ model }}
  <hr>
  <el-button type="primary" @click="updatedJob">child job</el-button>
</div>
</template>
<script setup>
import { ref, reactive } from 'vue'
const [model, modifiers] = defineModel({
  get(value) {
    console.log('-get-job---', value)
    return value
  },
  set(value) {
    if (modifiers.upLow) { // 有upLow修饰符的v-model 会将值累加 22
      return value + 22 
    }
    return value
  }
})
console.log('--job-model--', model)
console.log('--job-modifiers--', modifiers)
const updatedJob = () => {
  model.value = model.value + 10 // 更新model.value的值
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1603004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

别找了,这35份Excel自动排班表真的好用!

别再自己做排班表了&#xff0c;调了半天不好看格式还不对。 看看自己需要的是哪些类型的排班表&#xff1f;是公司值班&#xff0c;还是直播排班&#xff0c;还是考勤汇总&#xff0c;总有一个适合你。 刚整理的35份办公常用的排班表&#xff0c;希望能帮到你&#xff01; …

[lesson39]逗号操作符的分析

逗号操作符的分析 逗号操作符 逗号操作符(,)可以构成逗号表达式 逗号表达式用于将多个子表达式连接成为一个表达式逗号表达式的值为最后一个子表达式的值逗号表达式中的前N-1个子表达式可以没有返回值逗号表达式按照从左向右的顺序计算每个子表达式的值 重载逗号操作符 在C…

李廉洋:4.17晚间现货黄金,WTI原油美盘晚间操作及策略。

现在是否正在上演货币战&#xff0c;这对外汇和股票交易员意味着什么&#xff1f;在我看来这并不是一场货币战。实际情况是美元强势升值和亚洲货币普遍贬值&#xff0c;这其实是二阶段效应。由于美国通胀较预期更有粘性&#xff0c;经济数据也强于预期&#xff0c;美联储又变的…

monkey大全!可直接运用在项目中的常规monkey命令

测试步骤 adb devices-----了解包名-----adb shell monkey -----p 包名 ----v 运行次数&#xff08;多个参数的组合形成不同的用例以求最大的覆盖&#xff09;-----当崩溃或无响应时分析monkey日志 常规monkey命令 &#xff08;可直接在项目里使用&#xff09; adb shell m…

【计算机考研】目标学校改考408,报考人数大量减少,第二年能捡漏吗?

关键还是要看往年&#xff0c;最近三年的成绩。如果突然暴跌的话一定要注意第二年是否会弹很厉害。有时候408的学校就是一场博弈论&#xff0c;选择大于努力。 从大部分情况来看&#xff0c;爆冷后第一年回弹还是有限&#xff0c;但是第三年可能会爆热。 然后谈一下备考。 首…

信息系统项目管理师0053:设计和实施(4信息系统管理—4.1管理方法—4.1.3设计和实施)

点击查看专栏目录 文章目录 4.1.3设计和实施1.设计方法2.架构模式4.1.3设计和实施 开展信息系统设计和实施,首先需要将业务需求转换为信息系统架构,信息系统架构为将组织业务战略转换为信息系统的计划提供了蓝图。信息系统是支持组织中信息流动和处理的所有基础,包括硬件、软…

Seaborn:推荐一个好用的Python可视化工具

1. 引言 Seaborn 是建立在 matplotlib 基础上的数据可视化库&#xff0c;并与 Python 中的 pandas 数据结构紧密结合。可视化是 Seaborn 的核心部分&#xff0c;有助于直观的理解数据。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2. 安装 Seaborn库主要提供以下功能…

论文DOI号相关及在latex中添加DOI跳转

DOI与ISBN, ISSN的不同之处 图书和期刊内容都使用DOI。 与ISBN和ISSN不同的是&#xff0c;ISBN喝ISSN可以识别图书或期刊&#xff0c;DOI可以识别单个章节或单篇文章。 所以&#xff0c;如果要搜寻某本书籍&#xff0c;需要用到的是ISBN号&#xff1b;如果要搜寻某本期刊&…

微服务组件-注册中心

微服务组件-注册中心 使用restTemplate实现远程服务调用存在以下的问题&#xff1a; 1、消费者不知道如何获取服务提供者具体信息。 2、在远程调用的过程中&#xff0c;直接采用填写url的硬编码方式&#xff0c;如果服务消费者发生变化&#xff0c;得到的结果就会出错。 3、如果…

机器学习-随机森林算法预测房租模型

文章目录 机器学习-随机森林算法预测房租模型解决问题数据集探索性数据分析数据预处理构建模型并训练结果分析与评估参数调优结果预测经验总结参考文章 机器学习-随机森林算法预测房租模型 解决问题 根据待租房源相关信息&#xff0c;通过随机森林机器学习算法构件预测模型&a…

代码随想录算法训练营第二十九天|491.递增子序列、46.全排列、46.全排列II

491. 非递减子序列 思路&#xff1a; 在90.子集II (opens new window)中我们是通过排序&#xff0c;再加一个标记数组来达到去重的目的。 而本题求自增子序列&#xff0c;是不能对原数组进行排序的&#xff0c;排完序的数组都是自增子序列了。 所以不能使用之前的去重逻辑&…

C++_特殊类的设计和单例模式

文章目录 学习目标&#xff1a;1.请设计一个类&#xff0c;不能被拷贝2. 请设计一个类&#xff0c;只能在堆上创建对象3. 请设计一个类&#xff0c;只能在栈上创建对象4. 请设计一个类&#xff0c;不能被继承5. 请设计一个类&#xff0c;只能创建一个对象(单例模式) 特殊类的设…

Django中的数据库优化与ORM性能调优【第169篇—ORM性能调优】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Django中的数据库优化与ORM性能调优 在开发基于Django的Web应用程序时&#xff0c;数据库是…

上下文输入无限制,谷歌发布Infini-Transformer

去年&#xff0c;百川智能发布号称全球最长的上下文窗口大模型Baichuan2-192K&#xff0c;一次性可输入35万字&#xff0c;超越GPT-4。 今年3月&#xff0c;Kimi智能助手宣布在上下文窗口技术上突破200万字。 紧追其后&#xff0c;国内各大互联网巨头纷纷布局升级自家大模型产…

【C语言】贪吃蛇项目(1) - 部分Win32 API详解 及 贪吃蛇项目思路

文章目录 一、贪吃蛇项目需要实现的基本功能二、Win32 API介绍2.1 控制台2.2 部分控制台命令及调用函数mode 和 title 命令COORD 命令GetStdHandle&#xff08;获取数据&#xff09;GetConsoleCursorInfo&#xff08;获取光标数据&#xff09;SetConsoleCursorInfo &#xff08…

数字化转型之路-云原生与ChaosMeta

作者&#xff1a;刘凇杉&#xff08;chaosmeta-platform发起人&#xff09; 一.引言 随着科技的快速发展和信息时代的到来&#xff0c;数字化转型已成为企业不可或缺的战略选择。作为中国领先的科技金融企业&#xff0c;蚂蚁集团深谙数字化转型的重要性&#xff0c;并在其转型…

LeetCode 704.二分查找

LeetCode 704.二分查找 1、题目 题目链接&#xff1a;704. 二分查找 2、思路 这道题目是要在有序数组 nums 中找到目标值 target&#xff0c;符合二分查找的前提条件&#xff08;线性表必须是有序的&#xff0c;且采用顺序存储&#xff09;。同时题目还强调数组中无重复元…

2024最新在线工具箱网站系统源码

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买!购买本专栏住如有什么源码需要,可向博主私信,第二天即可发布!博主有几万资源) 2024最新在线工具箱网站系统源码是一…

怎样将excel的科学计数法设置为指数形式?

对了&#xff0c;这个问题中所谓的“指数形式”是指数学上书写的右上标的指数格式&#xff0c;能不能通过单元格设置来做这个格式的转换呢&#xff1f; 一、几个尝试 以下&#xff0c;以数字123000为例来说明。 情况1.转换成数学上的书写方式&#xff0c;如下图的样子&#x…

基于SpringBoot+Vue的二手车交易系统的设计与实现(源码+文档+包运行)

一.系统概述 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统二手车交易信息管理难度大&#xff0c;容错率低&…