對vue響應式資料更新的誤解

2021-09-17 07:47:08 字數 1369 閱讀 8498

對於剛接觸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 ...