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

Vue3学习(Vue3.3新特性——defineModel宏详解)

目录

一、Vue3.3新特性——defineModel宏。

(1)背景介绍与探讨。

(2)父子组件间双向绑定demo。(未使用defineModel宏)

1、父组件中引入子标签并使用v-model绑定一个响应式变量。

2、子组件使用defineProps接收属性modelValue,再使用defineEmits声明事件'update:modelValue'。监听输入框的值。

(3)父子组件间双向绑定demo。(使用defineModel宏)

1、子组件使用defineModel宏代替props接收属性,其次不需要定义事件emits。

2、父组件更替原来子标签并双向绑定v-model。

3、如果是Vue3.3版本,还需在vite.config.js文件中额外配置才能生效!(更高版本不需要)


一、Vue3.3新特性——defineModel宏。

(1)背景介绍与探讨。
  • 官方文档。


  1. defineModel宏是一个实验性质的语法(在Vue3.3版本时),它能够快速的完成数据的双向绑定!
  2. 实际作用:简化父子组件间双向绑定的“v-model”的使用
  3. 在 Vue3 之前版本,使用 v-model 实现父子组件双向绑定。需在子组件定义 props 接收 modelValue,定义 emits 触发 update:modelValue 事件,代码较繁琐。
  4. 因为在vue3中,自定义组件上使用v-model,相当于传递一个modelValue属性,同时触发 update:modelValue 事件!如下图所示。


  • 因为父组件在子组件使用v-model绑定。所以在子组件就需要使用props去接收defineProps宏),然后再使用emits去定义父组件绑定事件 ‘update:modelValue’defineEmits宏)。

  • 所以当使用新特性 defineModel宏 就能大大简化这其中的代码和逻辑!
  • 不需要再去定义props接收与emits事件声明。若需要修改值时更不需要手动emit触发事件下方通过demo间的对比,突出新特性 defineModel宏 的使用效果
(2)父子组件间双向绑定demo。(未使用defineModel宏)
1、父组件中引入子标签并使用v-model绑定一个响应式变量。
<script setup>
import MyInput from "./components/Myinput.vue";
import {ref} from "vue";
const txt = ref('123456') //设置默认输入框的值123456
</script><template><div><h1>我是顶层组件App.vue</h1><div style="border: 1px solid #000;padding: 10px"><MyInput v-model="txt"></MyInput>父组件响应式数据:{{txt}}</div></div>
</template><style scoped></style>

2、子组件使用defineProps接收属性modelValue,再使用defineEmits声明事件'update:modelValue'。监听输入框的值。
<script setup>
//接收属性modelValue
defineProps({modelValue: String,
})//声明父组件绑定的事件'update:modelValue'
const emit = defineEmits(['update:modelValue'])</script><template><div>
<!-- @input监听输入框输入事件,并把最新输入的值传递给父组件进行更新 -->子组件输入框:<inputtype="text"v-bind:value="modelValue"@input="e => emit('update:modelValue', e.target.value)"></div>
</template><style scoped></style>

  • 页面初始渲染效果。


(3)父子组件间双向绑定demo。(使用defineModel宏)
1、子组件使用defineModel宏代替props接收属性,其次不需要定义事件emits。
<script setup>
import { defineModel } from 'vue'
//使用defineModel宏代替:接收属性modelValue与声明父组件绑定的事件'update:modelValue'
const modelValue = defineModel()</script><template><div><!-- @input监听输入框输入事件,并把最新输入的值传递给父组件进行更新 --><!--   不再使用emit更新输入框的值 @input="e => emit('update:modelValue', e.target.value)"-->子组件输入框:<inputtype="text"v-bind:value="modelValue"@input="e => modelValue = e.target.value"></div>
</template><style scoped></style>

2、父组件更替原来子标签并双向绑定v-model。
<script setup>
import MyInput02 from "./components/Myinput02.vue";
import {ref} from "vue";
const txt = ref('123456') //设置默认输入框的值123456
</script><template><div><h1>我是顶层组件App.vue</h1><div style="border: 1px solid #000;padding: 10px"><MyInput02 v-model="txt"></MyInput02>父组件响应式数据:{{txt}}</div></div>
</template><style scoped></style>

  • 页面渲染效果。


  • 与其他的宏函数一样,底层子组件编译后也是转换为对应的props与emits。

3、如果是Vue3.3版本,还需在vite.config.js文件中额外配置才能生效!(更高版本不需要)
  • 配置完记得重启工程:npm run dev。

http://www.xdnf.cn/news/572383.html

相关文章:

  • OpenCv高阶(十六)——Fisherface人脸识别
  • MySQL 索引的增删改查
  • Docusaurus Umami
  • 算法优选系列(9.BFS 解决拓扑排序)
  • GStreamer (四)交叉编译
  • 华为eNSP无线AC/AP组网实战
  • 基于大模型的闭合性尺桡骨干骨折全方位诊疗研究报告
  • 现代计算机图形学Games101入门笔记(二十)
  • V少JS基础班之第五弹
  • ElasticSearch导读
  • 【网络安全】日志采集、监控任务守护进程详细教程(附实战案例)
  • 打卡31天
  • Python学习Day1:安装
  • 谷歌2025年I/O开发者大会热点总结
  • shell脚本总结3
  • 【LLMs篇】12:Qwen3 技术报告翻译
  • 人工智能路径:技术演进下的职业发展导航
  • 20个关于Java编程语言的常见问题
  • 从微积分到集合论(1630-1910)(历史简介)——第2章——牛顿(Newton)和莱布尼兹(Neibniz)以及莱布尼兹传统(H.J.M.Bos)
  • 2025年人工智能新应用与新技术全景解析
  • Qt+线段拖曳示例代码
  • 【UE5】环形菜单教程
  • 现代计算机图形学Games101入门笔记(十九)
  • 汽车电子电气架构诊断功能开发全流程解析
  • Linux nbd 网络块设备(2)-内核实现
  • fork 和 写时拷贝
  • NV009NV010美光闪存颗粒NV011NV012
  • 【Elasticsearch】字段别名
  • el-radio-group 与 el-dropdown 一起使用时的注意事项
  • Pytorch基础操作