一文詳解Vue的響應(yīng)式原則與雙向數(shù)據(jù)綁定
反應(yīng)性原則
它是 Vue.js 的核心特性之一,一個數(shù)據(jù)驅(qū)動的視圖,我們修改數(shù)據(jù)視圖來響應(yīng)更新,非常優(yōu)雅。
Vue2.x 使用 Object.defineProperty() 實現(xiàn),而 Vue3.x 使用 Proxy 實現(xiàn)。 我們先來看看2.x的實現(xiàn)。
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function getter () {
return obj[key];
},
set: function setter (newVal) {
...
}
})我們通過Object.defineProperty給對象obj添加屬性,可以設(shè)置對象屬性的getter和setter函數(shù)。
之后,我們每通過點語法獲取一個屬性,就會執(zhí)行這里的getter函數(shù)。 在這個函數(shù)中,我們會將調(diào)用這個屬性的依賴收集到一個集合中; 當我們給屬性賦值時,這個定義就會被觸發(fā)。 setter函數(shù),在輔助函數(shù)中,會通知集合中的依賴更新,讓數(shù)據(jù)變化驅(qū)動視圖變化。
3.x的核心思想和2.x一樣,只是在數(shù)據(jù)劫持上使用了Proxy而不是Object.defineProperty,但是在處理數(shù)組和響應(yīng)式處理新屬性時Proxy比Object.defineProperty更方便 .
let nObj=new Proxy(obj,{
get: function (target, propKey, receiver) {
console.log(`getting ${propKey}!`);
return Reflect.get(target, propKey, receiver);
},
set: function (target, propKey, value, receiver) {
console.log(`setting ${propKey}!`);
return Reflect.set(target, propKey, value, receiver);
}
})Vue響應(yīng)式原理的實現(xiàn)細節(jié)相信大部分人已經(jīng)很熟悉了,這里不再贅述。
雙向數(shù)據(jù)綁定
雙向數(shù)據(jù)綁定通常是指我們使用的 v-model 指令的實現(xiàn)。 它是 Vue 的一個特性,也可以說是輸入事件和值的語法糖。 Vue 通過 v-model 指令為組件添加輸入事件處理和值屬性賦值。
<template> <input v-model='localValue'/> </template>
上面的組件等價于下面的代碼。
<template>
<input @input='onInput' :value='localValue' />
<span>{{localValue}}</span>
</template>
<script>
export default{
data(){
return {
localValue:'',
}
},
methods:{
onInput(v){
this.localValue=v.target.value;
console.log(this.localValue)
}
}
}
</script>因此,當我們修改輸入框的值時,我們通過v-model綁定的值也會同步修改。 基于以上原理,我們可以輕松實現(xiàn)一個雙向數(shù)據(jù)綁定組件。
v-model實踐
首先,我們定義一個Vue組件:
<tempalte>
<div class="count" @click="addCount">click me {{value}}</div>
</template>
<script>
export default{
props:{
value:{
type:Number,
default:0
}
},
watch:{
value(v){
this.localvalue=v;
}
},
methods:{
addCount(){
this.localvalue++;
this.$emit('input',this.localvalue);
}
},
data(){
return{
localvalue:0
}
},
created(){
this.localvalue=this.value;
}
}
</script>上面的組件指定我們在 props 中添加 value 屬性,并在 value 更新時觸發(fā) input 事件。 在創(chuàng)建的 hook 和 watch 中對 localvalue 的賦值是將父組件的狀態(tài)同步到子組件。
通過上面的組件定義,我們可以使用 v-model 指令對組件進行雙向數(shù)據(jù)綁定。
<template>
<add-one v-model="count"></add-one>
<span>The parent component{{count}}</span>
</tempalte>
<script>
export default{
data() {
return {
count: 0,
};
},
methods: {
},
created(){
}
}
</script>以下是實際效果。

當然,我們也可以不使用 value 和 input 事件的組合。 為了讓組件的定義更加語義化,我們還可以自定義屬性和事件,實現(xiàn)雙向綁定。 我們可以在組件的模型選項中設(shè)置值和事件。 如下:
export default{
model:{
value:'count',
event:'change'
},
props:{
count:{
type:Number,
default:0
}
},
methods:{
addCount(){
this.localvalue++;
this.$emit('change',this.localvalue);
}
},
}由上述組件定義。
<add-one v-model="count"></add-one>
相當于:
<template>
<add-one @change='onChange' :count='count'></add-one>
<span>{{count}}</span>
</template>
<script>
export default{
data(){
return {
count:0,
}
},
methods:{
onChange(v){
this.count=v;
console.log(this.count)
}
}
}
</script>只是v-model指令幫我們做了上面的事件添加、屬性綁定和狀態(tài)同步操作。
到此這篇關(guān)于一文詳解Vue的響應(yīng)式原則與雙向數(shù)據(jù)綁定的文章就介紹到這了,更多相關(guān)Vue雙向數(shù)據(jù)綁定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue動態(tài)綁定多個類名方法詳解(:class動態(tài)綁定多個類名)
vue中可以通過:class=""這樣來根據(jù)一定的條件來動態(tài)添加class,但是有時候需要判斷的條件比較多,需要動態(tài)添加的class也比較多,下面這篇文章主要給大家介紹了關(guān)于vue動態(tài)綁定多個類名(:class動態(tài)綁定多個類名)的相關(guān)資料,需要的朋友可以參考下2022-11-11
vue2 elementui if導(dǎo)致的rules判斷失效的解決方法
文章討論了在使用Vue2和ElementUI時,將if語句放在el-form-item內(nèi)導(dǎo)致rules判斷失效的問題,并提出了將判斷邏輯移到外部的解決方案,感興趣的朋友一起看看吧2024-12-12
在vue項目中 實現(xiàn)定義全局變量 全局函數(shù)操作
這篇文章主要介紹了在vue項目中 實現(xiàn)定義全局變量 全局函數(shù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
解決vue初始化項目時,一直卡在Project description上的問題
今天小編就為大家分享一篇解決vue初始化項目時,一直卡在Project description上的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
在Vue中使用Avue、配置過程及實際應(yīng)用小結(jié)
在項目中遇到通過點擊加號實現(xiàn)輸入框的增加、以及對該輸入框的輸入內(nèi)容進行驗證,通過這些誘導(dǎo)因素創(chuàng)作的這篇文章,本文重點給大家介紹在Vue中使用Avue、配置過程以及實際應(yīng)用,需要的朋友可以參考下2022-10-10

