Vue.js 和 MVVM 的小细节
Vue.js 和 MVVM 的小细节一、什么是 MVVM它和 Vue.js 有什么关系MVVMModel-View-ViewModel是一种软件架构模式它将应用的 UI 逻辑与业务逻辑分离。在 Vue.js 中MVVM 被巧妙地实现为-Model代表数据层通常是 JavaScript 对象。-View代表视图层即 HTML 模板。-ViewModel核心桥梁即 Vue 实例负责数据绑定和指令解析。初学者常忽略的一个细节是Vue.js 并非严格遵循经典 MVVM因为其 Model 层允许直接修改数据而无需通过 ViewModel 的显式方法。这种灵活性既是优势也可能引发问题。### 二、基础概念数据绑定与响应式系统Vue.js 的响应式系统是 MVVM 的核心。当数据变化时视图自动更新。这背后依赖Object.definePropertyVue 2或ProxyVue 3。#### 代码示例 1经典的数据绑定javascript// 这是一个简单的 Vue 2 示例展示响应式数据绑定const app new Vue({ el: #app, data: { message: Hello, Vue!, count: 0 }, methods: { increment() { this.count; // 直接修改数据视图自动更新 } }});htmldiv idapp p{{ message }}/p button clickincrement点击次数{{ count }}/button/div小细节Vue 的响应式系统只能检测到数据属性的变化但无法检测新增或删除的属性。例如app.newProp test不会触发视图更新。这就是为什么 Vue 3 改用Proxy来捕获所有操作。### 三、核心机制虚拟 DOM 与 diff 算法MVVM 的 ViewModel 不仅负责数据绑定还通过虚拟 DOM 提升性能。当数据变化时Vue 会生成新的虚拟 DOM 树与旧树进行 diff 比较仅更新差异部分。#### 代码示例 2虚拟 DOM 的 diff 过程模拟javascript// 模拟 Vue 的虚拟节点创建和 diff 算法简化版function createVNode(tag, props, children) { return { tag, props, children };}function diff(oldNode, newNode) { if (oldNode.tag ! newNode.tag) { // 如果标签不同直接替换整个节点 console.log(替换节点, oldNode.tag, -, newNode.tag); return newNode; } if (oldNode.children ! newNode.children) { // 如果文本内容不同更新文本 console.log(更新文本内容); } // 递归比较子节点 if (oldNode.children newNode.children) { for (let i 0; i oldNode.children.length; i) { diff(oldNode.children[i], newNode.children[i]); } }}// 示例比较两个虚拟节点const oldVNode createVNode(div, {}, [ createVNode(p, {}, [旧文本])]);const newVNode createVNode(div, {}, [ createVNode(p, {}, [新文本])]);diff(oldVNode, newVNode); // 输出更新文本内容小细节Vue 的 diff 算法采用“同层比较”策略不会跨层级比较这减少了计算复杂度但要求开发者避免频繁销毁和重建组件树。### 四、高级用法计算属性与侦听器在 MVVM 中ViewModel 可以通过计算属性computed和侦听器watch来处理复杂逻辑。-计算属性基于依赖缓存的计算结果只有依赖变化时才重新计算。-侦听器监听数据变化并执行异步或开销较大的操作。#### 示例计算属性与侦听器的对比javascriptconst app new Vue({ el: #app, data: { firstName: John, lastName: Doe, fullName: John Doe // 初始值 }, computed: { // 计算属性自动缓存只有 firstName 或 lastName 变化时才重新计算 computedFullName() { return this.firstName this.lastName; } }, watch: { // 侦听器监听 firstName 和 lastName 的变化手动更新 fullName firstName(newVal) { this.fullName newVal this.lastName; }, lastName(newVal) { this.fullName this.firstName newVal; } }});小细节计算属性默认是只读的但可以通过get和set方法实现双向绑定。例如computedFullName可以设置set方法以便在表单中修改全名时自动拆分。### 五、MVVM 的陷阱与最佳实践1.避免直接操作 DOMMVVM 的核心是数据驱动应该尽量通过数据变化来更新视图而不是用ref或querySelector直接操作 DOM。2.合理使用 key在列表渲染时为每个元素绑定唯一的key帮助 Vue 更高效地复用和重排节点。3.组件通信的细节父组件通过 props 传递数据子组件通过事件通知父组件。避免跨多级组件传递 props可以使用 Vuex 或 provide/inject。#### 示例组件通信的正确姿势javascript// 子组件Vue.component(child, { props: [value], template: input :valuevalue input$emit(\input\, $event.target.value)});// 父组件new Vue({ el: #app, data: { message: 你好 }, template: child :valuemessage inputmessage $event/child});小细节使用v-model实际上是:value和input的语法糖。自定义组件也可以实现v-model只需遵循 prop 名为value、事件名为input的约定。### 六、总结Vue.js 通过对 MVVM 模式的灵活实现让前端开发更加高效。本文从基础的数据绑定讲起深入虚拟 DOM 的 diff 算法再到计算属性与侦听器的差异最后揭示了组件通信和最佳实践中的小细节。这些细节虽然容易被忽略但却是写出高性能、可维护 Vue 应用的关键。记住MVVM 的核心是数据驱动而 Vue.js 让你更容易掌控这种驱动方式。

相关新闻

Rust 在功能安全领域的应用前景:形式化验证与编译期不变量检查的协同

Rust 在功能安全领域的应用前景:形式化验证与编译期不变量检查的协同

Rust 在功能安全领域的应用前景:形式化验证与编译期不变量检查的协同 一、功能安全的形式化需求与 Rust 的天然契合 ISO 26262(道路车辆功能安全)和 IEC 61508(工业控制系统功能安全)对软件的要求分为 ASIL/SIL 等级。…

2026/7/27 0:16:03 阅读更多 →
告别滚动截图烦恼:Chrome全屏截图插件让你一键保存完整网页

告别滚动截图烦恼:Chrome全屏截图插件让你一键保存完整网页

告别滚动截图烦恼:Chrome全屏截图插件让你一键保存完整网页 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-…

2026/7/27 0:16:03 阅读更多 →
高收入人群税负结构解析:从累进税率到税务规划策略

高收入人群税负结构解析:从累进税率到税务规划策略

1. 先搞清楚这个标题到底在说什么“马斯克自曝税负近半:最终仅留四分之一”这个标题,核心说的是高收入人群的税负结构问题。很多人看到“税负近半”“仅留四分之一”会直接理解为“收入的一半都交税了”,但实际这里的计算逻辑比字面复杂。我一…

2026/7/27 0:16:03 阅读更多 →

最新新闻

【CarbonData】什么是 Segment?它在 CarbonData 的数据管理和生命周期中起什么作用?

【CarbonData】什么是 Segment?它在 CarbonData 的数据管理和生命周期中起什么作用?

CarbonData Segment 机制全解析:数据版本管理与生命周期的核心 问题引入 用户问题原文:什么是 Segment?它在 CarbonData 的数据管理和生命周期中起什么作用? 在电商用户画像构建平台中,我们曾遭遇一次严重的数据不一致事故:一条用于计算用户当日活跃度的查询 SELECT use…

2026/7/28 1:24:10 阅读更多 →
MLOps 数据漂移检测:模型性能退化的自动预警

MLOps 数据漂移检测:模型性能退化的自动预警

MLOps 数据漂移检测:模型性能退化的自动预警 一、模型上线的隐性退化 模型上线那天,指标漂亮,皆大欢喜。一个月后,准确率悄悄往下掉。没有报错,没有异常,只是预测越来越偏。这不是 bug,是数据漂…

2026/7/28 1:24:10 阅读更多 →
如何快速解密QMC音乐:完整技术指南与音频格式转换解决方案

如何快速解密QMC音乐:完整技术指南与音频格式转换解决方案

如何快速解密QMC音乐:完整技术指南与音频格式转换解决方案 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 还在为QQ音乐下载的加密音频无法在其他播放器上播放而…

2026/7/28 1:24:10 阅读更多 →
Kite框架实现动态表名的两种方案与实战经验

Kite框架实现动态表名的两种方案与实战经验

1. 动态表名需求背景解析在数据库应用开发中,动态表名是一个经典但容易被忽视的需求场景。我最早接触这个需求是在2018年开发一个多租户SaaS系统时,当时需要在同一个数据库实例中为每个租户动态分配独立的数据表。这种设计既能保证数据隔离,又…

2026/7/28 1:24:10 阅读更多 →
C++函数适配器:从std::bind2nd到std::bind的演进与实战

C++函数适配器:从std::bind2nd到std::bind的演进与实战

1. 项目概述:从“硬编码”到“灵活适配”的思维跃迁在C STL算法的世界里,我们常常会遇到一个看似简单却令人头疼的场景:手头有一个现成的算法,比如std::count_if,它需要一个一元谓词(一个参数)来…

2026/7/28 1:24:10 阅读更多 →
AWK多行文本解析实战:从日志处理到性能优化

AWK多行文本解析实战:从日志处理到性能优化

1. 多行文本解析的常见场景与核心挑战处理多行文本数据是日常开发中的高频需求。从日志分析到配置文件处理,再到数据清洗,我们经常需要从结构复杂或半结构化的文本中提取特定信息。以Nginx访问日志为例,单条记录可能跨越多行,包含…

2026/7/28 1:23:10 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻