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

Vue 3.5.13 中 `defineModel` 的局限性及解决方案

目录:

  • 问题描述
  • 解决方案
    • ✅ 方案一:重新赋值整个数组或对象
    • ✅ 方案二:使用 watch 监听外部 props 变化并同步本地状态
    • ✅ 方案三:使用 ref + v-model 显式管理
  • 最佳实践建议
  • 总结

在 Vue 3.5 版本中引入的 defineModel 是一种简化父子组件之间双向绑定的方式,它替代了 Vue 2 中的 .sync 和 Vue 3 中手动使用 v-model 的方式。然而,在实际开发中我发现 defineModel 在某些场景下存在一定的局限性。

问题描述

当子组件使用 defineModel 接收父组件传递的响应式数据时,如果直接操作数组索引(如 model.value[index] = newValue),Vue 并不会触发视图更新。这主要是因为 defineModel 返回的是一个 ref 包装后的响应式引用,而数组的索引赋值并不会触发 ref 的 .value 变化,因此无法被 Vue 检测到。

此外,若父组件传入的属性本身是非响应式的(例如通过 toRawJSON.parse(JSON.stringify(...)) 转换后的对象),也会导致子组件中的 defineModel 无法正确追踪变化,从而影响视图更新。


解决方案

✅ 方案一:重新赋值整个数组或对象

为了确保 Vue 能检测到变化,可以采用“重新赋值”的方式来更新整个数组或对象:

<script setup>
const model = defineModel('model', [])// 修改某个元素的值后,重新赋值整个数组
model

相关文章:

  • SpringAI+DeepSeek大模型应用开发——6基于MongDB持久化对话
  • 使用 MCP 驱动的分布式智能扩展 Space-O-RAN
  • sql解析,日期 trunc sysdate
  • Leetcode 刷题记录 12 —— 二叉树第三弹
  • 第19篇:数据库中间件中的 SQL 分析与审计机制设计
  • MCP案例 - 数据可视化工具服务器
  • 包含15个APP客户端UI界面的psd适用于餐厅咖啡店面包店快餐店
  • PyTorch数据分割全流程指南:从MNIST数据集到模型训练
  • 批量下载图片小工具
  • linux多线程之可重入函数
  • 面经的疑难杂症
  • Proteus8.17仿真51单片机驱动ST7920 LCD12864
  • vue2中setTimeout中调用methods方法问题
  • 基于51单片机的智能小车:按键调速、障碍跟踪、红外循迹与数码管显示(一个合格的单片机课设)
  • Elasticsearch9 + 通义大模型实现语义检索操作详解
  • Qt3d中的材质--PBR材质
  • Android 修改了页面的xml布局,使用了databinding,这时候编译时需要用到apt吗
  • chapter06-针对分类的微调
  • k8s-pod-01的学习
  • ROS2中,在工作空间根目录下执行source ./install/setup.bash的作用?
  • 互联网行业网站模板/刚刚发生 北京严重发生
  • 做网站公司牛鼻子/地推推广方案
  • 宝鸡做网站公司/网络推广平台排名
  • m开头的手机网站怎么做/网络广告营销有哪些
  • 做婚纱网站的图片/谷歌浏览器安卓版下载
  • 德州做网站公司/seo技术外包公司