最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

談?wù)剬ue響應(yīng)式數(shù)據(jù)更新的誤解

來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 22:33:40
文檔

談?wù)剬ue響應(yīng)式數(shù)據(jù)更新的誤解

談?wù)剬ue響應(yīng)式數(shù)據(jù)更新的誤解:對于剛接觸vue的同學會經(jīng)常遇到數(shù)據(jù)更新了但是模板沒有更新的問題,下面將結(jié)合vue的響應(yīng)式特性以及異步更新機制分析常見的錯誤: 異步更新帶來的數(shù)據(jù)響應(yīng)式誤解 異步數(shù)據(jù)的處理基本是一定會遇到的,處理不好就會遇到數(shù)據(jù)不更新的問題,但有一種情況是在未正
推薦度:
導讀談?wù)剬ue響應(yīng)式數(shù)據(jù)更新的誤解:對于剛接觸vue的同學會經(jīng)常遇到數(shù)據(jù)更新了但是模板沒有更新的問題,下面將結(jié)合vue的響應(yīng)式特性以及異步更新機制分析常見的錯誤: 異步更新帶來的數(shù)據(jù)響應(yīng)式誤解 異步數(shù)據(jù)的處理基本是一定會遇到的,處理不好就會遇到數(shù)據(jù)不更新的問題,但有一種情況是在未正

對于剛接觸vue的同學會經(jīng)常遇到數(shù)據(jù)更新了但是模板沒有更新的問題,下面將結(jié)合vue的響應(yīng)式特性以及異步更新機制分析常見的錯誤:

異步更新帶來的數(shù)據(jù)響應(yīng)式誤解

異步數(shù)據(jù)的處理基本是一定會遇到的,處理不好就會遇到數(shù)據(jù)不更新的問題,但有一種情況是在未正確處理的情況下也能正常更新,這就會造成一種誤解,詳情如下所示:

模板

<div id="app">
 <h2>{{dataObj.text}}</h2>
</div>

js

new Vue({
 el: '#app',
 data: {
 dataObj: {}
 },
 ready: function () {
 var self = this;

 /**
 * 異步請求模擬
 */
 setTimeout(function () {
 self.dataObj = {}; 
 self.dataObj['text'] = 'new text';
 }, 3000);
 }
 })

上面的代碼非常簡單,我們都知道vue中在data里面聲明的數(shù)據(jù)才具有響應(yīng)式的特性,所以我們一開始在data中聲明了一個dataObj空對象,然后在異步請求中執(zhí)行了兩行代碼,如下:

self.dataObj = {}; 
self.dataObj['text'] = 'new text';

首先清空原始數(shù)據(jù),然后添加一個text屬性并賦值。到這里為止一切都如我們所想的,數(shù)據(jù)和模板都更新了。

那么問題來了,dataObj.text具有響應(yīng)式的特性嗎?

模板更新了,應(yīng)該具有響應(yīng)式特性,如果這么想那么你就已經(jīng)走入了誤區(qū),一開始我們并沒有在data中聲明.text屬性,所以該屬性是不具有響應(yīng)式的特性的。

但模板切切實實已經(jīng)更新了,這又是怎么回事呢?

那是因為vue的dom更新是異步的,即當setter操作發(fā)生后,指令并不會立馬更新,指令的更新操作會有一個延遲,當指令更新真正執(zhí)行的時候,此時.text屬性已經(jīng)賦值,所以指令更新模板時得到的是新值。

具體流程如下所示:

  1. self.dataObj = {};發(fā)生setter操作
  2. vue監(jiān)測到setter操作,通知相關(guān)指令執(zhí)行更新操作
  3. self.dataObj['text'] = 'new text';賦值語句
  4. 指令更新開始執(zhí)行

所以真正的觸發(fā)更新操作是self.dataObj = {};這一句引起的,所以單看上述例子,具有響應(yīng)式特性的數(shù)據(jù)只有dataObj這一層,它的子屬性是不具備的。

對比示例:

模板

<div id="app">
 <h2>{{dataObj&&dataObj.text}}</h2>
</div>

js

new Vue({
 el: '#app',
 data: {
 dataObj: {}
 },
 ready: function () {
 var self = this;

 /**
 * 異步請求模擬
 */
 setTimeout(function () {
 self.dataObj['text'] = 'new text';
 }, 3000);
 }
 })

上述例子的模板是不會更新的。

Vue.$set

通過$set方法可以將添加一個具備響應(yīng)式特性的屬性,并且其子屬性也具備響應(yīng)式特性,但是必須是新屬性才可以,如果是本身已有的屬性該方法是不起作用的。

new Vue({
 el: '#app',
 data: {
 dataObj: {}
 },
 ready: function () {
 var self = this;

 /**
 * 異步請求模擬
 */
 setTimeout(function () {
 var data = {
 name: 'xiaofu',
 age: 18
 };
 var data01 = {
 name: 'yangxiaofu',
 age: 19
 };
 self.dataObj['person'] = {};
 self.$set('dataObj.info', data);
 self.$set('dataObj.person', data01); 
 }, 3000);
 }
 })

如上所示, .person屬性是不具備響應(yīng)式特性的。

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

談?wù)剬ue響應(yīng)式數(shù)據(jù)更新的誤解

談?wù)剬ue響應(yīng)式數(shù)據(jù)更新的誤解:對于剛接觸vue的同學會經(jīng)常遇到數(shù)據(jù)更新了但是模板沒有更新的問題,下面將結(jié)合vue的響應(yīng)式特性以及異步更新機制分析常見的錯誤: 異步更新帶來的數(shù)據(jù)響應(yīng)式誤解 異步數(shù)據(jù)的處理基本是一定會遇到的,處理不好就會遇到數(shù)據(jù)不更新的問題,但有一種情況是在未正
推薦度:
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top