談?wù)剬ue響應(yīng)式數(shù)據(jù)更新的誤解
對于剛接觸vue的同學(xué)會經(jīng)常遇到數(shù)據(jù)更新了但是模板沒有更新的問題,下面將結(jié)合vue的響應(yīng)式特性以及異步更新機(jī)制分析常見的錯(cuò)誤:
異步更新帶來的數(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中聲明了一個(gè)dataObj空對象,然后在異步請求中執(zhí)行了兩行代碼,如下:
self.dataObj = {};
self.dataObj['text'] = 'new text';
首先清空原始數(shù)據(jù),然后添加一個(gè)text屬性并賦值。到這里為止一切都如我們所想的,數(shù)據(jù)和模板都更新了。
那么問題來了,dataObj.text具有響應(yīng)式的特性嗎?
模板更新了,應(yīng)該具有響應(yīng)式特性,如果這么想那么你就已經(jīng)走入了誤區(qū),一開始我們并沒有在data中聲明.text屬性,所以該屬性是不具有響應(yīng)式的特性的。
但模板切切實(shí)實(shí)已經(jīng)更新了,這又是怎么回事呢?
那是因?yàn)関ue的dom更新是異步的,即當(dāng)setter操作發(fā)生后,指令并不會立馬更新,指令的更新操作會有一個(gè)延遲,當(dāng)指令更新真正執(zhí)行的時(shí)候,此時(shí).text屬性已經(jīng)賦值,所以指令更新模板時(shí)得到的是新值。
具體流程如下所示:
- self.dataObj = {};發(fā)生setter操作
- vue監(jiān)測到setter操作,通知相關(guān)指令執(zhí)行更新操作
- self.dataObj['text'] = 'new text';賦值語句
- 指令更新開始執(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方法可以將添加一個(gè)具備響應(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)式特性的。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Vue3關(guān)于響應(yīng)式數(shù)據(jù)類型詳解(ref、reactive、toRef、及toRefs)
- vue3中如何使用ref和reactive定義和修改響應(yīng)式數(shù)據(jù)(最新推薦)
- Vue.js響應(yīng)式數(shù)據(jù)的簡單實(shí)現(xiàn)方法(一看就會)
- Vue.js中provide/inject實(shí)現(xiàn)響應(yīng)式數(shù)據(jù)更新的方法示例
- Vue實(shí)現(xiàn)雙向綁定的原理以及響應(yīng)式數(shù)據(jù)的方法
- Vue創(chuàng)建淺層響應(yīng)式數(shù)據(jù)的實(shí)例詳解
相關(guān)文章
vue指令之表單控件綁定v-model v-model與v-bind結(jié)合使用
這篇文章主要介紹了vue指令之表單控件綁定v-model v-model與v-bind結(jié)合使用,需要的朋友可以參考下2019-04-04
詳解vue中點(diǎn)擊空白處隱藏div的實(shí)現(xiàn)(用指令實(shí)現(xiàn))
本篇文章主要介紹了詳解vue中點(diǎn)擊空白處隱藏div的實(shí)現(xiàn)(用指令實(shí)現(xiàn)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04
vue實(shí)現(xiàn)元素拖動并互換位置的實(shí)現(xiàn)代碼
在使用Vue的場景下,需要實(shí)現(xiàn)對元素進(jìn)行拖動交換位置,接下來通過本文給大家介紹vue實(shí)現(xiàn)元素拖動并互換位置的實(shí)現(xiàn)代碼,需要的朋友可以參考下2023-09-09
vant?Cascader級聯(lián)選擇實(shí)現(xiàn)可以選擇任意一層級
這篇文章主要介紹了vant?Cascader級聯(lián)選擇實(shí)現(xiàn)可以選擇任意一層級方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
vue實(shí)現(xiàn)點(diǎn)擊當(dāng)前標(biāo)簽高亮效果【推薦】
這篇文章主要介紹了vue實(shí)現(xiàn)點(diǎn)擊當(dāng)前標(biāo)簽高亮效果的思路詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-06-06

