【Vue】從 MVC 到 MVVM:前端架構演變與 Vue 的實踐之路

個人博客:haichenyi.com。感謝關注

一. 目錄

  • 一–目錄
  • 二–架構模式的演變背景?
  • 三–MVC:經典的分層起點?
  • 四–MVP:面向接口的解耦嘗試?
  • 五–MVVM:數據驅動的終極形態??
  • 六–Vue:MVVM 的現代化實踐???

二. 架構模式的演變背景?

??在軟件開發中,架構模式是解決代碼組織,職責分離和可維護行的核心方案。一個"好"的架構可以少很多不必要的麻煩。這個"好"就很關鍵,雖然架構模式經歷了從MVC——>MVP——>MVVM的演變,但是,不一定后者比前者好。比方說:你一個小項目,MVC就夠用了,非要去使用MVP,MVVM,就會多寫很多無用代碼。要結合多方面去考慮。軟件開發的終極目標是高類聚,低耦合 。但是,還是需要結合實際項目去選擇。18年MVVM剛興起的時候,就寫過一篇三者的區別的文章
MVC、MVP、MVVM比較。回顧了一下,感覺還是適用的。

三. MVC:經典的分層起點

  1. 核心思想
  • Model:管理數據和業務邏輯
  • View:呈現給用戶看的界面
  • Controller:接收用戶輸入,協調Model和View
  1. 典型流程
    2.1 用戶點擊按鈕觸發點擊事件,傳遞到Controller
    2.2 Controller觸發Model的事件去拿數據
    2.2 Model數據更新之后,通知Controller更新view
//偽代碼如下
let tvContent = document.getElementById("tv_content")
document.getElementById("btn").onclick = function () {axios.post().then(res=>{let data = res.datatvContent.textContent = data})
}
//當前頁面獲取view的某個組件的引用
//用戶點擊按鈕,觸發網絡請求,拿到數據
//拿到數據之后,更新tvContent的內容
//當前頁面就是Controller,網絡請求包裝的類就是Model,組件就是view
//Controller控制Model,model拿到數據之后控制view刷新界面
//代碼少,邏輯簡單,看不出來啥問題。挺好用的。但是,代碼多,邏輯復雜呢?
//(前面就說了架構要根據實際項目情況來看)
  1. 局限性
  • View和Model直接交互,耦合度高
  • Controller臃腫:業務代碼全都寫在Controller中

四. MVP:面向接口的解耦嘗試?

  1. 核心改進
  • Presenter(協調者):取代Controller,通過接口與view通信
  • View被動化,只負責頁面更新,邏輯由Presenter處理
  1. 典型流程
    2.1 View接收用戶操作,調用Presenter接口
    2.2 Presenter操作Model處理數據
    2.3 Model返回結果后,Presenter通過View接口更新頁面
//偽代碼如下,H5沒有接口的概念,我都不知道怎么舉例子
//這么理解,接口就是定義了一個一個的功能,需要有實現類去實現。
//還是上面的例子:用戶點擊按鈕更新頁面
interface IHome {update(content)
}class HomeImpl implements IHome {tvContent;constructor() {this.tvContent = document.getElementById("tv_content")}update(content: string) {this.tvContent.textContent = content}
}class HomePresenter {iHome: IHomeconstructor(iHome: IHome) {this.iHome = iHome}getData() {Axions.post().then(res=>{this.iHome.update(res.data)})}
}
let homePresenter = new HomePresenter(new HomeImpl())
document.getElementById("btn")?.onclick = function () {homePresenter.getData()
}
//上面的IHome接口,就是頁面更新的定義,HomeImpl就是這個接口的實現
//如果,頁面有很多種顯示需要處理,就需要定義多個方法,需要多個實現,以便于后面P層調用
//HomePresenter就是P層,負責數據處理,和使用接口的引用更新頁面
//按鈕點擊,觸發P層邏輯。
//這只是最簡單的寫法,有很多優化點。Android里面用的比較多
  1. 優勢與不足
  • 優勢:View和Model完全解耦
  • 不足:需要手動維護大量的接口,代碼冗余

五. MVVM:數據驅動的終極形態

  1. 核心思想
  • ViewModel:作為view和model的橋梁,通過數據綁定實現自動同步
  • 雙向綁定:view的輸入自動更新model,model數據變化自動刷新view
  1. 典型流程
    2.1 view通過模板語法(如{{data}}),綁定到ViewModel
    2.2 ViewModel監聽到Model變化,并轉換為View所需要的數據格式
    2.3 用戶操作觸發ViewModel的方法,更新Model
//這么舉例子呢,其實,萬變不離其中,你不做的事情,都是框架幫你做的。
//比方說,Vue的響應式編程,你只用改變數據,頁面自動更新。啥都不干,頁面怎么可能知道數據遍了,從而自動更新呢?
//實際上就是發布訂閱者模式觸發更新,那么,是誰發布,誰訂閱呢?放到后面第六部分講
  1. 優勢
  • 開發高效??:減少手動 DOM 操作,聚焦數據邏輯
  • 動態更新??:適合實時數據展示
  • 缺點:學習成本高,上手慢。原理復雜,遇到問題,不容易定位

六. Vue:MVVM 的現代化實踐

先說概念:Vue.js是mvvm模式集大成者,通過響應式系統和申明試模板,簡化了數據綁定。并引入組件化解決復雜場景的問題。
6.1 Vue中MVVM的映射關系

MVVM層Vue實現
Modeldata屬性
View模板(templtate)和樣式(style)
ViewModelVue組件實例(暴露:data,computed,methods)

6.2 雙向綁定的原理:Vue 的響應式系統通過以下步驟實現:

  • 數據劫持
    • vue2是使用 Object.defineProperty 監聽對象屬性。
    • vue3是使用Proxy代理對象,支持深層次監聽
// Vue 2 數據劫持示例
function defineReactive(obj, key, val) {Object.defineProperty(obj, key, {get() {dep.depend(); // 收集依賴return val;},set(newVal) {val = newVal;dep.notify(); // 觸發更新}});
}	
//這里插一句題外話,這個響應式的設計模式,就是觀察者模式
//數據本身就是被觀察者,get方法里面收集依賴,就是收集觀察者,set方法里面觸發更新,就是通知觀察者數據發生了變化
//vuex使用的是發布訂閱者模式。
//下一篇文章。就講講這兩種設計模式吧。
  • 依賴收集
    • 每個組件對應一個 ??Watcher??,在渲染時訪問數據屬性,觸發 getter 收集依賴。
  • 分發更新
    • 數據修改時觸發 setter,通知所有關聯的 Watcher 重新渲染(通過虛擬 DOM 對比更新真實 DOM,Diff算法)。

6.3 示例:數據變化驅動視圖更新?

<template><div><!-- 雙向綁定:v-model 語法糖 --><input v-model="message" /><p>{{ reversedMessage }}</p></div>
</template><script>
export default {data() {return { message: "Hello Vue!" }; // Model},computed: {reversedMessage() { // ViewModel 邏輯return this.message.split('').reverse().join('');}}
}
</script>

Vue 的雙向綁定?,解析如下:

HTML 模板?

<div id="app"><input v-model="message" /><p>{{ reversedMessage }}</p>
</div>

?JavaScript 邏輯?

// 模擬 Vue 實例
const data = { message: "Hello" };// 1. 數據劫持
defineReactive(data, "message", data.message);// 2. 計算屬性(依賴 message)
const computed = {reversedMessage: () => data.message.split("").reverse().join("")
};// 3. 模板渲染 Watcher
new Watcher(() => {//歸根結底,頁面更新的方法,還是這個。我們前面說的mvc,mvp頁面更新也是這個方法//所以,你以為它很神奇,其實,底層原理都是一樣的。主要還是看每個人的思路。document.querySelector("p").textContent = computed.reversedMessage();
});// 4. 雙向綁定(輸入框 → 數據)
document.querySelector("input").addEventListener("input", (e) => {data.message = e.target.value; // 修改數據 → 觸發 setter → 更新視圖
});

效果??:

  1. 輸入框內容變化時,data.message 更新。
  2. reversedMessage 自動重新計算,p標簽內容實時更新。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902227.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【算法】快速排序、歸并排序(非遞歸版)

目錄 一、快速排序&#xff08;非遞歸&#xff09; 1.原理 2.實現 2.1 stack 2.2 partition(array,left,right) 2.3 pivot - 1 > left 二、歸并排序&#xff08;非遞歸&#xff09; 1.原理 2.實現 2.1 gap 2.1.1 i 2*gap 2.1.2 gap * 2 2.1.3 gap < array.…

CasualLanguage Model和Seq2Seq模型的區別

**問題1&#xff1a;**Causal Language Modeling 和 Conditional Generation 、Sequence Classification 的區別是什么&#xff1f; 因果語言模型(Causal Language Model)&#xff1a; 預測給定文本序列中的下一個字符&#xff0c;一般用于文本生成、補全句子等&#xff0c;模型…

【計算機視覺】三維視覺項目 - Colmap二維圖像重建三維場景

COLMAP 3D重建 項目概述項目功能項目運行方式1. 環境準備2. 編譯 COLMAP3. 數據準備4. 運行 COLMAP 常見問題及解決方法1. **編譯問題**2. **運行問題**3. **數據問題** 項目實戰建議項目參考文獻 項目概述 COLMAP 是一個開源的三維重建軟件&#xff0c;專注于 Structure-from…

狀態管理最佳實踐:Bloc架構實踐

狀態管理最佳實踐&#xff1a;Bloc架構實踐 引言 Bloc (Business Logic Component) 是Flutter中一種強大的狀態管理解決方案&#xff0c;它基于響應式編程思想&#xff0c;通過分離業務邏輯和UI表現層來實現清晰的代碼架構。本文將深入探討Bloc的核心概念、實現原理和最佳實踐…

Python多任務編程:進程全面詳解與實戰指南

1. 進程基礎概念 1.1 什么是進程&#xff1f; 進程(Process)是指正在執行的程序&#xff0c;是程序執行過程中的一次指令、數據集等的集合。簡單來說&#xff0c;進程就是程序的一次執行過程&#xff0c;它是一個動態的概念。 想象你打開電腦上的音樂播放器聽歌&#xff0c;…

Linux 網絡基礎(二) (傳輸協議層:UDP、TCP)

目錄 一、傳輸層的意義 二、端口號 1、五元組標識一個通信 2、端口號范圍劃分 3、知名端口號&#xff08;Well-Know Port Number&#xff09; &#xff08;1&#xff09;查看端口號 4、綁定端口號數目問題 5、pidof & netstat 命令 &#xff08;1&#xff09;ne…

得佳勝哲訊科技 SAP項目啟動會:膠帶智造新起點 數字轉型新征程

在全球制造業加速向數字化、智能化轉型的浪潮中&#xff0c;膠帶制造行業正迎來以“自動化生產、數據化運營、智能化決策”為核心的新變革。工業互聯網、大數據分析與智能裝備的深度融合&#xff0c;正推動膠帶制造從傳統生產模式向“柔性化生產精準質量控制全鏈路追溯”的智慧…

大數據學習棧記——MapReduce技術

本文介紹hadoop中的MapReduce技術的應用&#xff0c;使用java API。操作系統&#xff1a;Ubuntu24.04。 MapReduce概述 MapReduce概念 MapReduce是一個分布式運算程序的編程框架&#xff0c;核心功能是將用戶編寫的業務邏輯代碼和自帶默認組件整合成一個完整的分布式運算程序…

Centos9 離線安裝 MYSQL8

centos 9 離線安裝 mysql 8 參考教程 1. 官網下載mysql 下載地址 2. 將文件傳輸到Centos中解壓 軟件全部安裝到了/opt中 在opt中新建mysql目錄&#xff0c;解壓到mysql目錄中 tar -xvf mysql壓縮文件 mysql[rootcentoshost mysql]# ls mysql-community-client-8.4.5-1.e…

helm的go模板語法學習

1、helm chart 1.0、什么是helm&#xff1f; 介紹&#xff1a;就是個包管理器。理解為java的maven、linux的yum就好。 安裝方法也可參見官網&#xff1a; https://helm.sh/docs/intro/install 通過前面的演示我們知道&#xff0c;有了helm之后應用的安裝、升級、查看、停止都…

display的一些學習記錄

收集的SDM的log&#xff1a; 01-01 00:00:15.311 933 933 I SDM : Creating Display HW Composer HAL 01-01 00:00:15.311 933 933 I SDM : Scheduler priority settings completed 01-01 00:00:15.311 933 933 I SDM : Configuring RPC threadpool 0…

【Rust 精進之路之第2篇-初體驗】安裝、配置與 Hello Cargo:踏出 Rust 開發第一步

系列&#xff1a; Rust 精進之路&#xff1a;構建可靠、高效軟件的底層邏輯 **作者&#xff1a;**碼覺客 發布日期&#xff1a; 2025-04-20 引言&#xff1a;磨刀不誤砍柴工&#xff0c;裝備先行&#xff01; 在上一篇文章中&#xff0c;我們一起探索了 Rust 誕生的緣由&…

【深度學習】計算機視覺(17)——ViT理解與應用

文章目錄 Embedding1 概念2 Q&A &#xff08;1&#xff09;3 Positional Encoding4 Q&A &#xff08;2&#xff09; ViT樣例及Embedding可視化理解1 簡化ViT練習2 CLS Token3 Embedding可視化4 多頭注意力可視化 Embedding技術體系結構參考來源 在研究中對特征的編碼和…

肖特基二極管詳解:原理、作用、應用與選型要點

一、肖特基二極管的基本定義 肖特基二極管&#xff08;Schottky Diode&#xff09; 是一種基于金屬-半導體結&#xff08;肖特基勢壘&#xff09;的二極管&#xff0c;其核心特性是低正向壓降&#xff08;Vf≈0.3V&#xff09;和超快開關速度。 結構特點&#xff1a;陽極采用金…

DeepSeek在數據倉庫的10大應用場景

一、智能數據集成與清洗 多源數據整合&#xff1a;DeepSeek能夠從多種數據源中提取、轉換和加載數據&#xff0c;實現跨系統數據的高效整合。 數據清洗與標準化&#xff1a;通過智能算法自動識別并糾正數據中的錯誤、不一致性和缺失值&#xff0c;提升數據質量。 二、數據倉…

提示詞構成要素對大語言模型跨模態內容生成質量的影響

提示詞構成要素對大語言模型跨模態內容生成質量的影響 提示詞清晰度、具象性與質量正相關 限定指向性要素優于引導指向性要素 大語言模型生成內容保真度偏差 以訊飛星火大模型為實驗平臺,選取100名具備技術素養的人員,從提示詞分類、構成要素和實踐原則歸納出7種提示詞組…

BeautifulSoup 庫的使用——python爬蟲

文章目錄 寫在前面python 爬蟲BeautifulSoup庫是什么BeautifulSoup的安裝解析器對比BeautifulSoup的使用BeautifulSoup 庫中的4種類獲取標簽獲取指定標簽獲取標簽的的子標簽獲取標簽的的父標簽(上行遍歷)獲取標簽的兄弟標簽(平行遍歷)獲取注釋根據條件查找標簽根據CSS選擇器查找…

關于MacOS使用Homebrew的詳細介紹

Homebrew 是 macOS&#xff08;和 Linux&#xff09;上最流行的包管理工具&#xff08;Package Manager&#xff09;&#xff0c;用于快速安裝、更新和管理各種開發工具、命令行程序、開源軟件等。它類似于&#xff1a; Ubuntu/Debian 的 aptCentOS/RHEL 的 yumWindows 的 Cho…

最新扣子空間實操指南

一、首先要先獲取到內部測試的邀請碼&#xff0c; 我們先打開扣子空間官網&#xff1a;https://space.coze.cn/ 輸入邀請碼后進入該頁面&#xff1a; 它這里支持文件上傳&#xff0c;擴展里面有很多插件&#xff0c;頁支持MCP各種插件. 探索模式有兩種&#xff0c;一種是ai自…

ubuntu22.04安裝dukto

1.添加源 sudo add-apt-repository ppa:xuzhen666/dukto2.進行更新和安裝 sudo apt update sudo apt install dukto3.報錯 $ sudo apt install dukto 正在讀取軟件包列表... 完成 正在分析軟件包的依賴關系樹... 完成 正在讀取狀態信息... 完成 您也許需要…