面試題 你能寫乙個Vue的雙向資料繫結嗎?

2021-10-07 08:02:23 字數 2725 閱讀 2937

在目前的前端面試中,vue的雙向資料繫結已經成為了乙個非常容易考到的點,即使不能當場寫出來,至少也要能說出原理。本篇文章中我將會仿照vue寫乙個雙向資料繫結的例項,名字就叫myvue吧。結合注釋,希望能讓大家有所收穫。

1、原理

vue的雙向資料繫結的原理相信大家也都十分了解了,主要是通過object物件的defineproperty屬性,重寫data的set和get函式來實現的,這裡對原理不做過多描述,主要還是來實現乙個例項。為了使**更加的清晰,這裡只會實現最基本的內容,主要實現v-model,v-bind 和v-click三個命令,其他命令也可以自行補充。

新增網上的一張圖

2、實現

頁面結構很簡單,如下

包含:乙個input,使用v-model指令

乙個button,使用v-click指令

乙個h3,使用v-bind指令。

我們最後會通過類似於vue的方式來使用我們的雙向資料繫結,結合我們的資料結構新增注釋

data: ,

methods: ,}})

首先我們需要定義乙個myvue建構函式:

function myvue(options)
為了初始化這個建構函式,給它新增一 個_init屬性

function myvue(options) 

myvue.prototype._init = function (options)

this.$methods = options.methods; // this.$methods = }

}

並改造_init函式

myvue.prototype._obverse = function (obj) 

var value;

for (key in obj)

object.defineproperty(this.$data, key, `);

return value;

},set: function (newval) `);

if (value !== newval) }})

}}} myvue.prototype._init = function (options)

接下來我們寫乙個指令類watcher,用來繫結更新函式,實現對dom元素的更新

function watcher(name, el, vm, exp, attr) 

watcher.prototype.update = function ()

更新_init函式以及_obverse函式

myvue.prototype._init = function (options) ;   //_binding儲存著model與view的對映關係,也就是我們前面定義的watcher的例項。當model改變時,我們會觸發其中的指令類更新,保證view也能實時更新

//...

} myvue.prototype._obverse = function (obj)

_directives:

};//...

var binding = this._binding[key];

object.defineproperty(this.$data, key, `);

if (value !== newval) )}}

})}}}

那麼如何將view與model進行繫結呢?接下來我們定義乙個_compile函式,用來解析我們的指令(v-bind,v-model,v-clickde)等,並在這個過程中對view與model進行繫結。

myvue.prototype._init = function (options) 

var _this = this;

var nodes = root.children;

for (var i = 0; i < nodes.length; i++)

if (node.hasattribute('v-click')) )();

}if (node.hasattribute('v-model') && (node.tagname == 'input' || node.tagname == 'textarea'))

_this._binding[attrval]._directives.push(new watcher(

'input',

node,

_this,

attrval,

'value'

))return function()

})(i));

}if (node.hasattribute('v-bind')) }}

至此,我們已經實現了乙個簡單vue的雙向繫結功能,包括v-bind, v-model, v-click三個指令。效果如下圖

附上全部**,不到150行

text-align: center;

}

乙個面試題

題目是 假設乙個 搜尋引擎收錄了2 24首歌曲,並記錄了可收聽這些歌曲的2 30條url,但每首歌的url不超過2 10個。系統會定期檢查這些url,如果乙個url不可用則不出現在搜尋結果中。現在歌曲名和url分別通過整型的song id和url id唯一確定。對該系統有如下需求 1 通過song ...

乙個面試題

在不超過最右邊的數量的情況下任意組合,要求加起來不超過20280這個數字,但達成最接近的情況,現有一種方法為 1290 4 2990 5,差170,有沒有更接近20280的答案 資料如下 4900 13790 22990 5 意思是不能超過5次,但可以使用1次,2次,3次,4次,5次。2390 31...

乙個面試題

res fromkeys name password age print res print res print id res name id res password res name 666 print res 輸出 57496360 57496360 fromkeys 建立字典時,字典中所有的...