Vue 是一種流行的 JavaScript 框架,它的最大特點(diǎn)就是響應(yīng)式設(shè)計(jì)。所謂響應(yīng)式,就是當(dāng)屬性值發(fā)生變化時(shí),視圖會(huì)自動(dòng)更新。這個(gè)功能的實(shí)現(xiàn)離不開(kāi) Vue 的重要特性:
var data = { message: 'Hello World!' } var vm = new Vue({ data: data, created: function () { console.log('message is: ' + this.message) } })
Vue 的響應(yīng)式依靠了 Object.defineProperty 的 setter 方法。在上面的例子中,我們通過(guò)給 Vue 傳入一個(gè) data 對(duì)象,然后在內(nèi)部用 Object.defineProperty 對(duì)其中的屬性進(jìn)行劫持,從而實(shí)現(xiàn)了響應(yīng)式設(shè)計(jì)。
由于 Vue 的響應(yīng)式機(jī)制,我們可以十分方便地對(duì)數(shù)據(jù)進(jìn)行更新和操作:
vm.message = 'Hello Vue!'
這個(gè)語(yǔ)句會(huì)觸發(fā) Vue 內(nèi)部的 setter 方法,實(shí)現(xiàn)視圖的更新。Vue 的限制是它只能檢測(cè)已經(jīng)被添加到 data 里面的屬性,如果想要?jiǎng)討B(tài)添加屬性,需要使用Vue.set(object, key, value),Vue.delete(object, key)方法。
除了直接修改屬性,Vue 的 computed 也是響應(yīng)式機(jī)制的體現(xiàn)。computed 屬性的值是計(jì)算出來(lái)的結(jié)果,它受到了響應(yīng)式數(shù)據(jù)的限制,只要依賴數(shù)據(jù)有變化,計(jì)算屬性就會(huì)重新計(jì)算:
var vm = new Vue({ data: { message: 'Hello World!' }, computed: { reversedMessage: function () { return this.message.split('').reverse().join('') } } })
在上面的例子中,reversedMessage 屬性通過(guò) Vue 的響應(yīng)式機(jī)制,始終同步地反映出 message 屬性的值。在頁(yè)面中使用時(shí),直接調(diào)用即可:
{{ reversedMessage }}
Vue 的響應(yīng)式機(jī)制對(duì)于開(kāi)發(fā)者而言,意味著更快更輕松的開(kāi)發(fā)流程。當(dāng)數(shù)據(jù)發(fā)生變化時(shí),我們不需要手動(dòng)更新視圖,而是讓 Vue 給我們自動(dòng)更新,這大大提升了我們的開(kāi)發(fā)效率。同時(shí),Vue 在內(nèi)部做了很多優(yōu)化,提高了響應(yīng)式機(jī)制的性能與穩(wěn)定性,讓開(kāi)發(fā)者可以更加放心地使用。