Vue.js 和 MVVM 的小细节
📅 2026/7/27 0:16:14
👁️ 次浏览
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 的天然契合
ISO 26262(道路车辆功能安全)和 IEC 61508(工业控制系统功能安全)对软件的要求分为 ASIL/SIL 等级。…
📅 2026/7/27 0:16:14
告别滚动截图烦恼: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:14
1. 先搞清楚这个标题到底在说什么“马斯克自曝税负近半:最终仅留四分之一”这个标题,核心说的是高收入人群的税负结构问题。很多人看到“税负近半”“仅留四分之一”会直接理解为“收入的一半都交税了”,但实际这里的计算逻辑比字面复杂。我一…
📅 2026/7/27 0:16:14
智能扫码革命:米哈游游戏登录的终极解决方案 【免费下载链接】MHY_Scanner MHY扫码登录器,支持从直播流抢码。 项目地址: https://gitcode.com/gh_mirrors/mh/MHY_Scanner
在米哈游游戏生态中,扫码登录已成为玩家日常体验的关键环节。…
📅 2026/7/27 1:15:39
视频博主提供了相关视频的缩略图,点击可跳转至视频页面([缩略图](/posts/2026/isp_mcast/1.png),视频链接:https://youtu.be/nHzU-sspN54 )。参考资料以下这些视频等资料对博主很有帮助,也推荐给读者&#…
📅 2026/7/27 1:15:39
选型核心原则本文仅输出室外舞台音响灯光服务企业的通用选型方法,不涉及任何产品或品牌推荐,所有评判标准均有公开权威来源,可自行对照验证。通用选型标准(占比40%)本次标准全部参考公开权威文件制定,涵盖3…
📅 2026/7/27 1:15:39
阅读时长:约 18 分钟 | 难度:★★★★☆ | 篇章:第 7 篇 风水罗盘模块 对应源码:entry/src/main/ets/pages/fengshui/FengshuiReportPage.ets 前言
风水报告页是玄象项目风水分析的“结论“页面。基于用户方位与朝向数据&am…
📅 2026/7/27 1:15:39
阅读时长:约 18 分钟 | 难度:★★★★☆ | 篇章:第 7 篇 风水罗盘模块 对应源码:entry/src/main/ets/pages/fengshui/FengshuiHomePage.ets 前言
风水门户是玄象项目风水模块的入口页。页面展示“风水罗盘““GPS 风水分析”…
📅 2026/7/27 1:15:39
15分钟高效掌握!Windows风扇控制神器FanControl完整指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/…
📅 2026/7/27 1:14:39
现象在 WezTerm 终端中,包含中文路径的文本(如标签页标题、Shell 提示符、路径补全)中,某些汉字时而渲染为日文字形,时而显示为简体中文(中国大陆)字形。以「径」字为例,日文写法右侧…
📅 2026/7/27 0:00:07
这个问题看似在寻找一个答案,实际上是在寻找一种“值得继续投入的方向感”。很多人在问:
“人生有什么意义?”
深层可能是在问:
我现在做的事情值得吗?我的努力有没有价值?我的存在是不是重要?未…
📅 2026/7/27 0:00:07
1. 为什么MoE架构让大模型参数量翻倍却不增加推理成本?去年我在部署一个千亿参数大语言模型时,首次接触到混合专家模型(Mixture of Experts,简称MoE)架构。当时最让我震惊的是,这种架构的模型参数量可以达到…
📅 2026/7/27 0:00:07
更多请点击:
https://codechina.net
第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
📅 2026/7/27 1:11:21
1. 项目背景与核心价值去年参与的一个短剧项目让我深刻体会到传统创作流程的痛点:编剧团队花了三周打磨剧本,角色设计反复修改了七版,最后成片时又因为演员档期问题不得不临时调整分镜。这种低效的创作模式在快节奏的内容行业越来越难以为继。…
📅 2026/7/27 1:11:21
remix-i18next TypeScript类型安全实践:确保翻译键与类型定义同步 【免费下载链接】remix-i18next The easiest way to translate your React Router framework mode apps 项目地址: https://gitcode.com/gh_mirrors/re/remix-i18next
在开发多语言应用时&am…
📅 2026/7/27 1:11:21
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/26 7:10:22
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/26 17:10:53
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/26 5:10:17