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

【一文读懂】什么是MVVM?

MVVM

Vue 是一个渐进式的 JavaScript 框架,它采用了 MVVM(Model-View-ViewModel)设计模式,这使得它能够高效地进行数据绑定和用户界面的更新。

概念

1. Model(模型)

  • 含义:Model 代表应用程序的数据层,它通常是 JavaScript 对象或数组。这个部分存储着应用程序的状态(例如,用户输入的数据、从 API 获取的数据等)。
  • 与 Vue 的关系:在 Vue 中,data 选项就是模型(Model)。它是数据源,当数据发生变化时,Vue 会自动更新界面。

2. View(视图)

  • 含义:View 代表用户界面(UI)层,显示模型数据,并允许用户与应用进行交互。通常是 HTML 和 CSS 的组合。
  • 与 Vue 的关系:在 Vue 中,View 是由模板(template)来定义的,模板中通过绑定来展示 data(模型)的内容,响应用户的输入并显示相应的数据。

3. ViewModel(视图模型)

  • 含义:ViewModel 充当了模型和视图之间的中介,它负责将模型数据转换为视图可以显示的格式,同时也负责将用户在视图中做出的操作转化为对模型的更新。换句话说,ViewModel 是数据与视图的双向绑定桥梁。
  • 与 Vue 的关系:在 Vue 中,Vue 实例 是 ViewModel。它管理着 data(模型)和 template(视图)之间的关系。Vue 的响应式系统会自动监测 data 的变化,并实时更新 View(即模板)。

具体实现

  • 数据绑定:Vue 通过 双向数据绑定(two-way data binding)技术实现了视图和数据的同步。它使用了 响应式系统(reactivity system)来追踪模型数据的变化,当数据变化时,自动更新视图。
  • 指令:Vue 使用了模板语法中的指令(如 v-bind, v-model, v-for 等)来将视图与数据进行绑定。
  • 事件处理:Vue 中的 v-on@ 符号用于绑定事件。当用户操作视图时,事件会触发,进而通过 ViewModel 更新模型数据,形成双向绑定。
举个例子:
<div id="app"><input v-model="message"><p>{{ message }}</p>
</div><script>new Vue({el: '#app',data: {message: 'Hello Vue!'}})
</script>

在这个例子中:

  • Modeldata 中的 message 是模型数据。
  • View:HTML 中的 <input><p> 元素组成了视图。
  • ViewModel:Vue 实例充当了 ViewModel,负责将模型数据 message 绑定到视图 <input><p> 中。

传统HTML

在传统的 HTML 中,我们通过 JavaScript 来直接操控 DOM 元素。每当模型数据变化时,我们需要显式地更新视图。最基本的方式就是通过 innerHTMLtextContent 来更新 HTML 元素的内容。

示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Model-View Binding</title>
</head>
<body><input type="text" id="input" placeholder="Enter text"><p id="output"></p><script>// 定义模型let model = {message: 'Hello, World!'};// 选择视图中的 DOM 元素const inputElement = document.getElementById('input');const outputElement = document.getElementById('output');// 更新视图(将模型数据插入到视图中)function updateView() {outputElement.textContent = model.message;}// 监听视图上的用户输入inputElement.addEventListener('input', (event) => {model.message = event.target.value;  // 更新模型updateView();  // 更新视图});// 初始化视图updateView();</script>
</body>
</html>

在上面的例子中,输入框的值被绑定到 model.message,并且每次用户修改输入框内容时,JavaScript 会手动更新视图(即 <p> 标签内容)。

总结

  • MVVM 模式使得 Vue 的数据和视图得以同步更新,开发者可以专注于业务逻辑而无需手动更新 UI。
  • 通过响应式数据绑定,Vue 在内部处理了大量的 DOM 操作,使得开发更加高效和清晰。

数据双向绑定

1. 原理(响应式系统)

Vue 使用 JavaScript 的 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)来实现响应式数据。通过这些机制,Vue 能够监控数据的变化,当数据发生变化时,自动通知视图更新。

  • 数据对象的代理:Vue 会将 data 中的每个属性通过 getter 和 setter 进行代理,从而监控属性的访问和修改。
  • 依赖收集和视图更新:当组件渲染时,Vue 会收集视图中使用的属性作为依赖。之后,当这些属性的值变化时,Vue 会触发相关的视图更新。

2. 实现(指令系统)

Vue 提供了 v-model 指令来实现双向数据绑定,特别是在表单元素(如 <input><textarea><select>)中,v-model 可以方便地实现数据和视图的同步。

v-model 的工作原理:
  • 视图到模型的绑定(用户输入):用户修改输入框的值时,Vue 会将输入的值自动更新到组件的数据中。
  • 模型到视图的绑定:当模型数据变化时,Vue 会自动更新视图中的内容。

相关文章:

【一文读懂】什么是MVVM?

MVVM Vue 是一个渐进式的 JavaScript 框架&#xff0c;它采用了 MVVM&#xff08;Model-View-ViewModel&#xff09;设计模式&#xff0c;这使得它能够高效地进行数据绑定和用户界面的更新。 概念 1. Model&#xff08;模型&#xff09; 含义&#xff1a;Model 代表应用程序…...

GCD of Subset

法1&#xff1a; const int N1e6; signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n,k; cin>>n>>k;vector<int>a(n1),cnt(N10);/*桶cnt不要用map实现&#xff01;&#xff01;&#xff01;速度太慢*/vector<vector<int>>…...

BY组态:工业自动化的未来,触手可及

在工业4.0的浪潮下&#xff0c;智能化、数字化已成为制造业发展的核心驱动力。作为工业自动化领域的重要工具&#xff0c;组态软件在实现设备监控、数据采集、流程控制等方面发挥着不可替代的作用。然而&#xff0c;传统的组态软件往往存在开发周期长、学习成本高、灵活性不足等…...

DeepSeek在linux下的安装部署与应用测试

结合上一篇文章&#xff0c;本篇文章主要讲述在Redhat linux环境下如何部署和使用DeepSeek大模型&#xff0c;主要包括ollama的安装配置、大模型的加载和应用测试。关于Open WebUI在docker的安装部署&#xff0c;Open WebUI官网也提供了完整的docker部署说明&#xff0c;大家可…...

华为昇腾920b服务器部署DeepSeek翻车现场

最近到祸一台HUAWEI Kunpeng 920 5250&#xff0c;先看看配置。之前是部署的讯飞大模型&#xff0c;发现资源利用率太低了。把5台减少到3台&#xff0c;就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘&#xff0c;500G的系统盘&#xff0c; 2块3T固态…...

JavaScript 内置对象-数组对象

在JavaScript中&#xff0c;数组&#xff08;Array&#xff09;是一种非常重要的数据结构&#xff0c;它允许我们以列表的形式存储多个值&#xff0c;并提供了丰富的内置方法来操作这些值。无论是处理简单的数值集合还是复杂的对象数组&#xff0c;数组对象都能提供强大的支持。…...

Qt——连接MySQL数据库之ODBC的方法详细总结(各版本大同小异,看这一篇就够了)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》 《实用硬件方案设计》 《结构建模设…...

进程令牌:Windows 安全架构中的关键元素

一、进程令牌概述 进程令牌&#xff08;Process Token&#xff09;是 Windows 操作系统中一个重要的安全机制&#xff0c;它包含了与进程安全上下文相关的详细信息。每个进程在执行时都会关联一个进程令牌&#xff0c;令牌用于确定该进程可以访问哪些资源以及能执行哪些操作。…...

基于springboot的超时代停车场管理平台(源码+文档)

大家好我是风歌&#xff0c;曾担任某大厂java架构师&#xff0c;如今专注java毕设领域。今天要和大家聊的是一款基于springboot的超时代停车场管理平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于Spring Boot的超时代停车场…...

缓存穿透、缓存击穿、缓存雪崩的区别与解决方案

1. 缓存穿透&#xff08;Cache Penetration&#xff09; 定义&#xff1a;大量请求查询 数据库中不存在的数据&#xff0c;导致请求绕过缓存直接访问数据库&#xff0c;造成数据库压力过大。 场景&#xff1a; 恶意攻击&#xff1a;例如用不存在的用户ID频繁请求。 业务误操作…...

箭头函数的this指向谁

先看1个重要原则&#xff1a; 由Vue管理的函数&#xff0c;一定不要写箭头函数&#xff0c;箭头函数的this就不再是Vue实例了 箭头函数的 this 指向在定义时确定&#xff0c;继承自外层作用域&#xff08;即定义时的上下文&#xff09;的 this&#xff0c;且无法通过 call、app…...

【愚公系列】《Python网络爬虫从入门到精通》012-字符串处理

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...

【Python】01-基础

目录 1、命令行简介1.1 命令行结构1.2 常用dos指令 2、环境变量2.1 查看2.2 添加2.3 修改2.4 删除 3、path环境变量4、进制5、文本文件和字符集6、Sublime使用 1、命令行简介 命令行就是文本交互页面&#xff0c;通过命令行可以使用指令来操作计算机 1.1 命令行结构 版本及版…...

Java-DFS(深度优先搜索)

原理 深度优先搜索的基本思路是从一个节点开始&#xff0c;依次访问它的每一个邻居节点&#xff0c;直到达到一个没有未被访问的邻居的节点为止。这个过程可以使用递归或者栈来实现。其特点是尽可能深入每一个分支&#xff0c;然后再回溯。 DFS算法常用于解决以下类型的问题&…...

AI大模型编程能力对比:DeepseekClaudeGemini

在当今快速发展的技术领域&#xff0c;人工智能&#xff08;AI&#xff09;模型在编程和数据处理方面的应用越来越广泛。不同的AI模型因其独特的设计理念和技术优势&#xff0c;适用于不同的编程任务和场景。 本文将对三种主流的AI模型——DeepSeek v3、Gemini Flash 2.0 和 C…...

用C++实现点到三角形最小距离的计算

1、全部代码 #include <iostream> #include <cmath> #include <array> #include <algorithm>// 二维点结构体 struct Point2D {double x, y;Point2D(double x 0, double y 0) : x(x), y(y) {} };// 计算点到线段的最小距离 double pointToSegmen…...

解决前后端日期传输因时区差异导致日期少一天的问题

前端处理 1. 发送日期字符串而非时间戳 在前端使用日期选择器&#xff08;如 el-date-picker&#xff09;获取日期后&#xff0c;将日期转换为特定格式的字符串&#xff08;如 YYYY-MM-DD&#xff09;发送给后端&#xff0c;避免直接发送带有时区信息的时间戳或日期对象。这样…...

mmsegmentation自己的数据集+不同网络的config配对

比如说我们要用这个网络&#xff1a; 我们发现他内部继承了很多类&#xff0c;要想配对我们的数据集&#xff0c;就要进行父类的修改。 ../_base_/models/deeplabv3_unet_s5-d16.py, ../_base_/datasets/drive.py,../_base_/default_runtime.py, ../_base_/schedules/schedule…...

Golang官方编程指南

文章目录 1. Golang 官方编程指南2. Golang 标准库API文档 1. Golang 官方编程指南 Golang 官方网站&#xff1a;https://go.dev/ 点击下一步&#xff0c;查看官方手册怎么用 https://tour.go-zh.org/welcome/1 手册中的内容比较简单 go语言是以包的形式化管理函数的 搜索包名…...

ram的使用——初始化很重要

背景 ram是非常常用的ip&#xff0c;前人的经验告诉我们&#xff0c;如果不对ram进行初始化直接读写&#xff0c;不定态在实际上板时会出现不可预知的问题。 我们需要对ram进行初始化写0操作&#xff0c;代码如下。需要注意&#xff0c;复位释放时立马写入可能存在复位抖动的…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...