1. 程式人生 > >vue資料雙向繫結的原理和vue-router路由的實現原理

vue資料雙向繫結的原理和vue-router路由的實現原理

vue實現雙向資料繫結的原理就是利用了 Object.defineProperty() 這個方法重新定義了物件獲取屬性值(get)和設定屬性值(set)的操作來實現的。

在MDN上對該方法的說明是:Object.defineProperty() 方法會直接在一個物件上定義一個新屬性,或者修改一個物件的現有屬性, 並返回這個物件。

它接收三個引數,要操作的物件,要定義或修改的物件屬性名,屬性描述符。重點就是最後的屬性描述符。

屬性描述符是一個物件,主要有兩種形式:資料描述符和存取描述符。這兩種物件只能選擇一種使用,不能混合兩種描述符的屬性同時使用。上面說的get和set就是屬於存取描述符物件的屬性。

然後我們可以通過在存取描述符中的get和set方法內寫入自定義的邏輯來實現物件獲取屬性和設定屬性時的行為。

var keyValue = 1;
var obj = {};
Object.defineProperty(obj,'key', {
    enumerable: true,
    configurable: true,
    get: function(){
        return keyValue;
    },
    set: function(newValue){
        keyValue = newValue;
        console.log(`keyValue的值已發生改變,目前的值是:${keyValue}`);
    }
});

obj.key; // 1

obj.key = 'obj物件的key屬性已經綁定了變數keyValue的值';
// keyValue的值已發生改變,目前的值是:obj物件的key屬性已經綁定了變數keyValue的值
// "obj物件的key屬性已經綁定了變數keyValue的值"

keyValue; // "obj物件的key屬性已經綁定了變數keyValue的值"

上面這個例子就是改變了物件獲取屬性及設定屬性的預設行為。

物件obj獲取屬性key的值時,會觸發上面的get方法,得到的是變數keyValue的值,然後當重新設定key的值時,觸發set方法,會將變數keyValue的值改變為設定的值,如此就實現了一個簡單的雙向繫結:改變keyValue,obj.key得到的值也會改變,重新設定obj.key,keyValue一樣會隨之改變。

當然,vue的雙向繫結實際更復雜,但最基本的原理就是基於Object.defineProperty()方法改變資料存取的預設行為來實現的。

相關推薦

vue資料雙向原理vue-router路由實現原理

vue實現雙向資料繫結的原理就是利用了 Object.defineProperty() 這個方法重新定義了物件獲取屬性值(get)和設定屬性值(set)的操作來實現的。 在MDN上對該方法的說明是:Object.defineProperty() 方法會直接在一個物件上定義一

Vue資料雙向原理

vue資料雙向繫結是通過資料劫持結合釋出者-訂閱者模式的方式來實現的。 雙向繫結就是檢視上的變化能夠反映到資料上,資料上的變化也能反映到檢視上。如下圖所示: 關鍵點在於data如何更新view,因為view更新data其實可以通過事件監聽即可,比如input

談談Vue資料雙向原理,看看你的回答能打幾分

面試官的這個問題也可以理解成為“你是怎麼理解Vue資料繫結,知道它背後實現的原理麼”。一般剛畢業的前端新人可能會說,用v-model。(當然,這可能是句廢話) 如果簡單說下v-model指令,是Vue的語法糖之類的,可能不會讓面試官滿意,也看不出你對Vue的熟練程度。只能說

Vue資料雙向原理

先看效果圖 //程式碼: <div id="app"> <input v-model="name" type="text"> <h1>{{name}}</h1> </div&g

Vue資料雙向探究

使用過vue的小夥伴都會感覺,哇,這個框架對開發者這麼友好,簡直都要笑出聲了。 確實,使用過vue的框架做開發的人都會感覺到,以前寫一大堆操作dom,bom的東西,現在用不著了,對開發者來說更容易去注重對操作邏輯的思考和實現,省了不少事兒呢!!! 我是直接從原生js,jq的開發用過度到使用v

vue實現雙向資料原理實現vue雙向原理實現

轉自:canfoo#! vue的雙向繫結原理及實現 前言 先上個成果圖來吸引各位: 程式碼:                          &nb

面試總結:vue實現資料雙向原理

vue實現資料雙向繫結的原理就是用Object.defineproperty()重新定義(set方法)物件設定屬性值和(get方法)獲取屬性值的操縱來實現的 Object.property()方法的解釋:Object.property(引數1,引數2,引數3)   返回值為

vue響應式原理資料雙向原理

先來了解一下幾個相關概念 1、漸進式框架 下面是摘自知乎的一個解答(個人認為講述比較好的回答): 在我看來,漸進式代表的含義是:主張最少。 每個框架都不可避免會有自己的一些特點,從而會對使用者有一定的要求,這些要求就是主張,主張有強有弱,它的強勢程度會影響在業務開發中的

vue開發:vue,angular,react資料雙向原理分析

傳統做法 前端維護狀態,手動操作DOM更新檢視。前端框架對伺服器資料通過模版進行渲染。當用戶產生了一個動作之後,我們通過document.getElementBy... 手動進行DOM更新。  框架幫忙分離資料和檢視,後續狀態更新需要手動操作DOM,因為框架只管首次渲染,不追蹤狀態監聽變化。 雙向資料繫結

淺談vue,angular,react資料雙向原理分析

傳統做法 前端維護狀態,手動操作DOM更新檢視。前端框架對伺服器資料通過模版進行渲染。當用戶產生了一個動作之後,我們通過document.getElementBy... 手動進行DOM更新。  框架幫忙分離資料和檢視,後續狀態更新需要手動操作DOM,因為框架只管首次渲染,不

vue資料雙向實現原理

* Object.defineProperty() * 對物件的屬性進行 定義/修改 * */ let obj = {x:10} // 這兩種方式都相對來說比較簡單,直接,但是有些時候我們需要對物件的屬性的修改和增加進行必要的干預 //

Vue.js資料雙向實現原理

Vue.js 最核心的功能有兩個,一是響應式的資料繫結系統,二是元件系統。本文僅探究雙向繫結是怎樣實現的。一、訪問器屬性訪問器屬性是物件中的一種特殊屬性,它不能直接在物件中設定,而必須通過 defineProperty() 方法單獨定義。       var obj = {

vue原始碼學習——資料雙向的Object.defineProperty

情景:vue雙向繫結,這應該是多數講vue優勢脫口而出的名詞,然後你就會接觸到一個方法 Object.defineProperty(a,"b",{}) 這個方法該怎麼用 簡單例子敲一下 var a = {} Object.defineProperty(a,"b

React學習之旅----實現類似vue資料雙向

react沒有資料的雙向繫結,但可以用過一些方法實現: import React from 'react'; class TodoList extends React.Component { constructor(props) { super(props) this.sta

Vue-事件資料雙向

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>事件處理, 雙向資料繫結</title> <script src="js/v

vue雙向依賴收集

在掘金上買了一個關於解讀vue原始碼的小冊,因為是付費的,所以還比較放心 在小冊裡看到了關於vue雙向繫結和依賴收集的部分,總感覺有些怪怪的,然後就自己跟著敲了一遍。 敲完後,發現完全無法執行,  坑啊,  寫書人完全沒有測試過。 然後自己完善程式碼, 越寫越發現坑, 問題有些大。。。

vue中v-model的資料雙向(重要)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body&

Vue 建構函式、生命週期與資料雙向

Vue2 建構函式、生命週期與資料雙向繫結 Vue是一個響應式的、漸進式的JavaScript框架,它在設計上採用MVVM模式,將檢視與資料兩部分分離。下面就是一個簡單的Vue例項: <!DOCTYPE html> <html lang="en"> <h

vue資料雙向

1.在data中設定的資料才會進行雙向繫結 2.陣列 2.1.data中的陣列,觸發陣列更新的方式有:pop、push、shift、unshift、splice、sort、reverse 2.2.而filter、slice、cancat等方式並不會改變原陣

強大的JS方法Object.defineProperty詳解及VUE.JS雙向原理

Object.defineProperty是一個很了不起的方法。vue.js之所以能夠實現雙向繫結便是拜它所賜!defineProperty直接翻譯過來即是“定義屬性”,不過該方法可不僅僅是定義屬性這麼簡單,咱們還可以通過它來對屬性進行攔截設定! 我們知道物