對於剛接觸vue的同學會經常遇到資料更新了但是模板沒有更新的問題,下面將結合vue的響應式特性以及非同步更新機制分析常見的錯誤:
非同步資料的處理基本是一定會遇到的,處理不好就會遇到資料不更新的問題,但有一種情況是在未正確處理的情況下也能正常更新,這就會造成一種誤解,詳情如下所示:
new vue(
},ready: function () ;
self.dataobj['text'] = 'new text';
}, 3000);
}})
上面的**非常簡單,我們都知道vue中在data裡面宣告的資料才具有響應式的特性,所以我們一開始在data中宣告了乙個dataobj空物件,然後在非同步請求中執行了兩行**,如下:
self.dataobj = {};
self.dataobj['text'] = 'new text';
首先清空原始資料,然後新增乙個text屬性並賦值。到這裡為止一切都如我們所想的,資料和模板都更新了。
模板更新了,應該具有響應式特性,如果這麼想那麼你就已經走入了誤區,一開始我們並沒有在data中宣告.text
屬性,所以該屬性是不具有響應式的特性的。
但模板切切實實已經更新了,這又是怎麼回事呢?
那是因為vue的dom更新是非同步的,即當setter操作發生後,指令並不會立馬更新,指令的更新操作會有乙個延遲,當指令更新真正執行的時候,此時.text
屬性已經賦值,所以指令更新模板時得到的是新值。
具體流程如下所示:
所以真正的觸發更新操作是self.dataobj = {};
這一句引起的,所以單看上述例子,具有響應式特性的資料只有dataobj這一層,它的子屬性是不具備的。
對比示例:模板
js
new vue(
},ready: function () , 3000);
}})
上述例子的模板是不會更新的。
通過$set方法可以將新增乙個具備響應式特性的屬性,並且其子屬性也具備響應式特性,但是必須是新屬性才可以,如果是本身已有的屬性該方法是不起作用的。
new vue(
},ready: function () ;
var data01 = ;
self.dataobj['person'] = {};
self.$set('dataobj.info', data);
self.$set('dataobj.person', data01);
}, 3000);
}})
如上所示,.person
屬性是不具備響應式特性的。 vue無法更新資料(vue響應式)
原因 今天寫專案的時候頁面有乙個標題和狀態一直沒有發生變化。我一開始以為是非同步的問題,也確實,非同步方面確實存在問題。但是當解決非同步問題之後,發現我所需要的資料和狀態依舊沒有發生改變。如圖,1部分,我為了驗證非同步問題做了延遲處理。但是延遲3秒之後資料改變但是頁面引數依舊沒有改變。所以我在頁面上...
Vue 資料響應式
css響應式不用說大家都知道,拖動瀏覽器視窗大小時,內容布局和大小會自動變化。那麼vue的資料響應式就是,例項中,通過修改vm的.n值,就能改變data 中的n。let vm vue vue2中,資料響應式是通過object.defineproperty實現的。如果開發者給乙個data中不存在的變數...
Vue的資料響應式
示例 示例 可以給物件新增屬性value 可以給物件新增getter setter getter setter用於對屬性的讀寫進行監控 對mydata物件的屬性讀寫,全權由另乙個物件vm負責 那麼vm就是mydata的 用vm.n來操作mydata.n 當你建立乙個例項時 const vm new ...