媒介
Vue.js 作為一款風行的前端JavaScript框架,其核心特點之一就是雙向數據綁定。雙向數據綁定使得數據模型(Model)與用戶界面(View)之間可能實現主動同步,極大年夜處所便了開辟者。本文將深刻剖析Vue.js雙向數據綁定的道理,幫助讀者更好地懂得其背後的機制。
雙向數據綁定概述
雙向數據綁定意味著當數據模型產生變更時,視圖也會主動更新;反之,當視圖中的用戶輸入產生變更時,數據也會主動同步更新。這種機制簡化了用戶界面與數據模型之間的交互,進步了開辟效力。
雙向數據綁定的實現道理
Vue.js 的雙向數據綁定重要依附於以下多少個關鍵點:
1. 數據劫持(數據呼應式)
Vue.js 經由過程利用 Object.defineProperty
方法,將東西的屬性轉化為 getter 跟 setter 函數。當拜訪屬性時,會觸發 getter 函數,而當修改屬性值時,會觸發 setter 函數。
function defineReactive(obj, key, val) {
const dep = new Dep();
let value = val;
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter() {
if (Dep.target) {
dep.addSub(Dep.target);
}
return value;
},
set: function reactiveSetter(newVal) {
if (newVal !== value) {
value = newVal;
dep.notify();
}
}
});
}
class Dep {
constructor() {
this.subs = [];
}
addSub(sub) {
this.subs.push(sub);
}
notify() {
this.subs.forEach(sub => sub.update());
}
}
2. 察看者形式
察看者形式是一種計劃形式,它容許東西在狀況變更時告訴其他依附東西。Vue.js 中的察看者形式用於實現數據變更時告訴視圖更新。
class Watcher {
constructor(vm, key, callback) {
this.vm = vm;
this.key = key;
this.callback = callback;
Dep.target = this;
this.vm[this.key];
Dep.target = null;
}
update() {
this.callback.call(this.vm, this.vm[this.key]);
}
}
3. 指令剖析器(Complie)
指令剖析器擔任剖析 DOM 中的指令,並將指令與數據綁定。Vue.js 利用了 Complie 類來實現指令剖析。
class Complie {
constructor(el, vm) {
this.vm = vm;
this.el = el;
this.fragment = document.createDocumentFragment();
this.init();
}
init() {
const childNodes = this.el.childNodes;
for (let i = 0; i < childNodes.length; i++) {
const node = childNodes[i];
if (node.nodeType === 3) {
// 文本節點
this.complieText(node);
} else if (node.nodeType === 1) {
// 元素節點
this.complieNode(node);
}
}
this.el.appendChild(this.fragment);
}
complieText(node) {
// 省略文本節點指令剖析邏輯
}
complieNode(node) {
// 省略元素節點指令剖析邏輯
}
}
4. v-model 指令
v-model 指令是 Vue.js 中實現雙向綁定的核心指令。它經由過程監聽表單位素的變更並將其同步到數據模型,同時當數據模型變更時,主動更新表單位素的值。
Vue.directive('model', {
bind(el, binding) {
el.addEventListener('input', function (e) {
binding.value(e.target.value);
});
},
update(el, binding) {
el.value = binding.value;
}
});
總結
Vue.js 的雙向數據綁定機制基於數據劫持、察看者形式、指令剖析器跟 v-model 指令。這種機制使得數據模型與用戶界面之間可能實現主動同步,極大年夜處所便了開辟者。經由過程深刻懂得雙向數據綁定的道理,我們可能更好地利用 Vue.js 的特點,進步開辟效力。