# Vue怎么實現MVVM
## 一、MVVM模式概述
### 1.1 什么是MVVM
MVVM(Model-View-ViewModel)是一種軟件架構模式,由以下三部分組成:
- **Model**:數據模型層,負責業務邏輯和數據
- **View**:視圖層,負責界面展示
- **ViewModel**:視圖模型層,負責連接View和Model
### 1.2 MVVM與傳統MVC的區別
| 特性 | MVC | MVVM |
|-------------|--------------|-------|
| 通信方向 | 單向(Controller控制) | 雙向數據綁定 |
| 耦合度 | 較高 | 較低 |
| DOM操作 | 需要手動操作 | 自動更新 |
## 二、Vue的MVVM實現原理
### 2.1 核心機制
Vue通過以下技術實現MVVM:
1. **數據劫持**(Object.defineProperty/Proxy)
2. **依賴收集**(Dep/Watcher)
3. **模板編譯**(Compiler)
```javascript
// 簡化的響應式原理示例
function defineReactive(obj, key) {
let value = obj[key]
const dep = new Dep()
Object.defineProperty(obj, key, {
get() {
if (Dep.target) {
dep.addSub(Dep.target)
}
return value
},
set(newVal) {
value = newVal
dep.notify()
}
})
}
graph TD
A[new Vue] --> B[初始化數據]
B --> C[數據劫持]
C --> D[編譯模板]
D --> E[建立Watcher]
E --> F[依賴收集]
F --> G[數據變更通知]
G --> H[視圖更新]
Vue 2.x使用Object.defineProperty實現數據劫持:
class Observer {
constructor(value) {
this.walk(value)
}
walk(obj) {
Object.keys(obj).forEach(key => {
defineReactive(obj, key, obj[key])
})
}
}
Vue 3.x改用Proxy實現:
function reactive(obj) {
return new Proxy(obj, {
get(target, key) {
track(target, key)
return Reflect.get(target, key)
},
set(target, key, value) {
Reflect.set(target, key, value)
trigger(target, key)
}
})
}
class Dep {
constructor() {
this.subs = new Set()
}
addSub(sub) {
this.subs.add(sub)
}
notify() {
this.subs.forEach(sub => sub.update())
}
}
class Watcher {
update() {
// 執行更新操作
}
}
function compile(template) {
const ast = parse(template)
optimize(ast)
const code = generate(ast)
return new Function(`with(this){return ${code}}`)
}
class Vue {
constructor(options) {
this.$options = options
this._data = options.data
observe(this._data)
proxy(this, '_data')
new Compiler(options.el, this)
}
}
function proxy(vm, sourceKey) {
Object.keys(vm[sourceKey]).forEach(key => {
Object.defineProperty(vm, key, {
get() {
return vm[sourceKey][key]
},
set(val) {
vm[sourceKey][key] = val
}
})
})
}
虛擬DOM diff算法主要步驟: 1. 創建新舊VNode樹 2. 比較差異(同層比較) 3. 局部更新真實DOM
function patch(oldVnode, vnode) {
if (sameVnode(oldVnode, vnode)) {
patchVnode(oldVnode, vnode)
} else {
const parent = oldVnode.parentNode
parent.insertBefore(createElm(vnode), oldVnode)
parent.removeChild(oldVnode)
}
}
特性 | Vue | React |
---|---|---|
響應式原理 | 自動依賴追蹤 | 手動setState |
更新粒度 | 組件級 | 組件級 |
模板語法 | HTML-based | JSX |
特性 | Vue | Angular |
---|---|---|
變更檢測 | 細粒度依賴追蹤 | 臟檢查 |
學習曲線 | 平緩 | 陡峭 |
包大小 | 20-30KB | 50-60KB |
// 不佳寫法
data() {
return {
user: {
name: {},
address: {}
}
}
}
// 推薦寫法
data() {
return {
userName: '',
userAddress: ''
}
}
computed: {
filteredList() {
return this.list.filter(item => item.active)
}
}
Vue通過以下創新實現了高效的MVVM: 1. 基于依賴追蹤的響應式系統 2. 異步批量DOM更新策略 3. 虛擬DOM的智能diff算法
隨著Vue 3.x的發布,其響應式系統改用Proxy實現,帶來了更好的性能表現和更完善的特性支持(如對Map/Set的支持)。
”`
(注:實際字數為約2500字,完整2900字版本需要擴展每個章節的案例分析、更多代碼示例和性能對比數據??筛鶕枰M一步補充具體實現細節或實際項目中的應用場景。)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。