MVVM框架知识点大全(一)

简介: 教程来源 https://ljtgc.cn/article/323.html 本文系统解析MVVM架构模式,涵盖Model、View、ViewModel三层职责、双向数据绑定、计算属性与命令等核心机制,对比MVC/MVP,结合Vue.js等主流框架实践,助开发者构建高可维护、易测试的响应式应用。

在现代前端和后端开发中,如何有效地组织代码、分离关注点、提高可维护性一直是开发者关注的核心问题。MVVM(Model-View-ViewModel)架构模式应运而生,它通过清晰的三层分离和双向数据绑定机制,极大地简化了用户界面的开发复杂度。从微软的WPF到Web前端的Knockout、Vue.js,再到移动端的SwiftUI、Jetpack Compose,MVVM已经成为构建响应式用户界面的事实标准。本文将系统全面地梳理MVVM框架的核心知识点,从基础概念到高级实践,帮助开发者建立完整的知识体系。
8a59ee24-e149-4c75-8af9-02262f29d757.png

一、MVVM概述

1.1 什么是MVVM
MVVM(Model-View-ViewModel) 是一种软件架构模式,它将用户界面(UI)从业务逻辑和行为中清晰地分离出来。MVVM通过声明式数据绑定将View层与其他层连接起来,促进了UI和开发工作在同一代码库中的高效协同。

核心特性:
关注点分离:将界面、业务逻辑和数据模型严格分离
双向数据绑定:View和ViewModel自动同步,无需手动操作DOM
可测试性:ViewModel独立于UI,可进行单元测试
可维护性:代码结构清晰,职责明确

1.2 MVVM的历史
MVVM最初由微软在2005年定义,用于Windows Presentation Foundation(WPF)和Silverlight。John Grossman在关于Avalon(WPF的代号)的博文中正式推出了这一概念。
在微软推出MVVM之前,社区中已有类似的架构模式——MVP(Model-View-Presenter)和Martin Fowler在2004年提出的“展现模型”(Presentation Model)理念。展现模型的思想为MVVM的诞生奠定了理论基础。
近年来,MVVM已在JavaScript领域得到广泛实现,代表性框架包括KnockoutJS、Vue.js、Angular等,获得了整个开发社区的积极响应。

1.3 MVVM vs MVC vs MVP
image.png
1.4 架构分层
MVVM严格划分为三层结构,每层职责单一,通过标准化接口交互:

┌─────────────────────────────────────────────────────────────┐
│                         View 视图层                          │
│  - 展示UI界面                                                │
│  - 通过数据绑定关联ViewModel的状态与命令                      │
│  - 不包含业务逻辑                                            │
├─────────────────────────────────────────────────────────────┤
│                      ViewModel 视图模型层                     │
│  - 作为View与Model的中间层                                   │
│  - 处理业务逻辑和用户交互响应                                 │
│  - 暴露可绑定的状态与命令                                    │
├─────────────────────────────────────────────────────────────┤
│                        Model 数据模型层                       │
│  - 管理原始数据                                              │
│  - 定义数据结构与数据处理逻辑                                │
│  - 不依赖UI或ViewModel                                       │
└─────────────────────────────────────────────────────────────┘

二、Model(模型层)

2.1 Model的职责
Model层代表应用所用的领域相关数据或信息。一个典型例子是用户账号(姓名、头像、电子邮件)或音乐唱片(专辑名、年代、曲目)。

Model层的核心职责包括:
数据实体:用类或接口定义数据结构
数据源:封装数据获取与存储逻辑(网络请求、本地数据库)
数据验证:实现数据合法性校验

2.2 Model的规则
Model持有信息,但通常不包含操作行为。它不会格式化信息或影响数据的展现方式,因为这些是View和ViewModel的责任。
唯一的例外是验证——由Model进行数据验证是被认为可以接受的,例如检查电子邮件格式是否符合正则表达式要求。
2.3 Model实现示例

typescript
// 数据实体(Model):用户信息
export class User {
    id: string;
    name: string;
    age: number;
    email: string;

    constructor(id: string, name: string, age: number, email: string) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.email = email;
    }

    // 数据验证:年龄必须为正数
    validateAge(): boolean {
        return this.age > 0;
    }

    // 数据验证:邮箱格式
    validateEmail(): boolean {
        const emailRegex = /^[^\s@]+@([^\s@]+\.)+[^\s@]+$/;
        return emailRegex.test(this.email);
    }
}

// 数据源(Model层):获取用户数据
export class UserDataSource {
    async fetchUser(id: string): Promise<User> {
        const response = await fetch(`/api/user/${id}`);
        const data = await response.json();
        return new User(data.id, data.name, data.age, data.email);
    }

    saveUser(user: User): void {
        localStorage.setItem(`user_${user.id}`, JSON.stringify(user));
    }
}

三、ViewModel(视图模型层)

3.1 ViewModel的职责
ViewModel是MVVM架构的核心,它作为View和Model之间的“中间层”,负责业务逻辑处理和数据转换。ViewModel对外暴露可被View绑定的“状态”与“命令”,不直接操作UI。

核心职责:
从Model获取数据,转换为View可用的格式
响应用户交互,执行相应业务逻辑
维护View所需的状态
通过数据绑定自动同步View

3.2 ViewModel的核心特性
3.2.1 可观察状态
ViewModel通过可观察属性暴露状态,当状态变化时,View自动更新。这是MVVM“数据驱动UI”的核心机制。

typescript
// ViewModel中的可观察状态
class UserViewModel {
    // 可观察状态:用户信息(供View绑定)
    userInfo: User = new User('', '', 0, '');

    // 可观察状态:加载状态
    isLoading: boolean = false;

    // 可观察状态:错误信息
    errorMessage: string = '';
}

3.2.2 计算属性
计算属性是根据其他状态派生而来的值,在ViewModel中定义计算属性可以简化View的展示逻辑。

typescript
class UserViewModel {
    userInfo: User;

    // 计算属性:用户年龄描述
    get ageDesc(): string {
        return this.userInfo.age >= 18 ? '成年' : '未成年';
    }

    // 计算属性:用户显示名称
    get displayName(): string {
        return this.userInfo.name || '匿名用户';
    }
}

3.2.3 命令(Commands)
命令封装了用户交互对应的业务逻辑,供View的事件(如点击、提交)直接绑定。

typescript
class UserViewModel {
    // 命令:加载用户信息
    async loadUser(id: string): Promise<void> {
        this.isLoading = true;
        try {
            const rawUser = await this.dataSource.fetchUser(id);
            if (rawUser.validateAge()) {
                this.userInfo = rawUser;
            }
        } catch (error) {
            this.errorMessage = '加载用户失败';
        } finally {
            this.isLoading = false;
        }
    }

    // 命令:提交表单
    submitForm(): void {
        if (this.validateForm()) {
            this.dataSource.saveUser(this.userInfo);
        }
    }
}

3.3 ViewModel的独立性
ViewModel不应依赖任何特定平台的UI组件(如Button、TextBox),这是确保其可测试性和跨平台复用的关键。因此,应避免在ViewModel中直接使用平台相关的API。

3.4 数据转换与格式化
ViewModel的一个重要职责是数据转换——将Model层的原始数据转换为View所需的格式。例如,将Unix时间戳转换为可读日期格式。

typescript
class OrderViewModel {
    private rawOrder: Order;

    // 转换:Unix时间戳 → 格式化日期
    get formattedDate(): string {
        const date = new Date(this.rawOrder.timestamp * 1000);
        return date.toLocaleDateString('zh-CN');
    }

    // 转换:原始价格 → 货币格式
    get formattedPrice(): string {
        return `¥${this.rawOrder.price.toFixed(2)}`;
    }
}

来源:
https://ljtgc.cn/

相关文章
|
4天前
|
人工智能 API 开发工具
OpenClaw阿里云/本地部署实战+ iOS/macOS开发AI协同指南|OpenClaw+Codex/Claude Code集成教程
2026年,AI编程工具的爆发式发展正在重构iOS/macOS开发流程。OpenAI Codex的官方iOS开发指南发布,Anthropic Claude Code的SwiftUI代码质量持续领先,再加上Sentry收购后持续迭代的XcodeBuildMCP工具,AI已从“代码辅助”升级为“全流程协同伙伴”。而开源AI代理平台OpenClaw(Clawdbot)的出现,更是打通了“大模型调用+开发工具链+多端部署”的闭环,让开发者能够通过统一入口调度Codex、Claude Code等工具,适配SwiftUI开发、Liquid Glass适配、批量功能开发等核心场景。
335 2
|
传感器 人工智能 监控
智慧工地 AI 算法方案
智慧工地AI算法方案通过集成多种AI算法,实现对工地现场的全方位安全监控、精准质量检测和智能进度管理。该方案涵盖平台层、展现层与应用层、基础层,利用AI技术提升工地管理的效率和安全性,减少人工巡检成本,提高施工质量和进度管理的准确性。方案具备算法精准高效、系统集成度高、可扩展性强和成本效益显著等优势,适用于人员安全管理、施工质量监控和施工进度管理等多个场景。
1141 0
|
4天前
|
人工智能 运维 搜索推荐
AI语音客服落地之困:企业要的是“降本工具”,但用户要的是“解决问题”
AI语音客服落地难,主因非技术不足,而是企业误将其当作“降本工具”而非“体验升级系统”。认知偏差、运营缺失、成本误判、技术适配四大困境交织。破局关键在于转向“人机协同增强思维”,以客户体验为本,构建持续迭代的运营机制。
|
4天前
|
Java API
Java函数知识点大全(四)
教程来源 https://dnuhf.cn/ 本文系统讲解Java函数式编程核心:Lambda表达式(含语法、方法引用四种形式)、常用函数式接口(Predicate/Function/Consumer等)、Stream API(中间/终端操作、分组聚合)、异常处理技巧及方法设计最佳实践,涵盖从基础到高级的完整知识体系。
|
4天前
|
Java
Java函数知识点大全(三)
教程来源 https://ljtgc.cn/ 本文系统讲解Java面向对象核心机制:构造方法(含无参、有参、私有、拷贝及构造器链)、方法重写规则与@Override注解、抽象类与接口方法(含默认/静态/私有方法)及函数式接口,辅以典型代码示例,助你深入掌握Java OOP精髓。
|
11天前
|
前端开发 JavaScript
JavaScript学习知识点大全(二)
教程来源 https://app-a87ujc988w01.appmiaoda.com/ 本节系统讲解JavaScript核心数据结构与异步编程:涵盖数组(创建、遍历map/filter/reduce、增删改查及高级方法)、Set/Map集合操作与WeakSet/WeakMap弱引用特性;字符串常用方法与正则表达式(匹配、提取、替换及高级语法);以及回调、Promise、async/await异步处理与事件循环机制。
|
4天前
|
安全 C语言
C语言函数知识点大全(二)
教程来源 https://www.xcfsr.cn/category/open-source.html 本文系统讲解C语言中递归函数、函数指针与内联函数三大核心概念:递归涵盖阶乘、斐波那契、汉诺塔等经典案例及递归/迭代效率对比;函数指针详解声明、传参、返回值及在qsort中的实际应用;内联函数则对比宏定义,突出其类型安全与副作用更少的优势。
|
4天前
|
Linux API 网络安全
OpenClaw极速部署指南:阿里云轻量服务器一键部署、千问API配置与本地MacOS/Linux/Windows11搭建
2026年,OpenClaw(原Clawdbot)凭借轻量化、高扩展、全场景适配的特性,已成为AI自动化与智能交互的主流框架。阿里云轻量服务器凭借**秒级部署、预集成环境、低成本运维**的优势,成为OpenClaw云端部署的首选方案;同时,本地MacOS、Linux、Windows11部署可满足开发调试、离线运行等个性化需求。本文基于2026年最新版本,完整拆解**阿里云轻量服务器秒级部署OpenClaw**、**本地多系统部署**、**阿里云千问Qwen3-Max API配置**、**免费Coding Plan API配置**全流程,附可直接复制的代码命令与高频问题解答,帮助新手快速落地Op
80 0
|
1天前
|
前端开发 JavaScript Go
HTML+CSS+JS知识点大全(三)
教程来源 https://xcfsr.cn/category/software-dev.html 本节系统讲解JavaScript基础:涵盖语言特性(动态/弱类型、原型继承、函数一等公民、异步编程)、引入方式(内联/内部/外部脚本及async/defer/module)、变量声明(var/let/const)、八大数据类型与检测、运算符、流程控制、函数(声明/表达式/箭头/闭包)及常用数组方法,夯实前端开发核心功底。
|
4天前
|
SQL 安全 PHP
PHP安全防护全攻略:规避风险,守护应用安全
在Web应用开发中,安全是重中之重,尤其是PHP应用,由于其普及度高、入门门槛低,很多开发者在开发过程中容易忽视安全问题,导致应用出现安全漏洞,被黑客攻击,造成数据泄露、系统瘫痪等严重后果。
52 2