国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

談談對vue響應式數據更新的誤解

2024-05-06 15:13:32
字體:
來源:轉載
供稿:網友

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

異步更新帶來的數據響應式誤解

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

模板

<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里面聲明的數據才具有響應式的特性,所以我們一開始在data中聲明了一個dataObj空對象,然后在異步請求中執行了兩行代碼,如下:

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

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

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

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

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

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

具體流程如下所示:

    self.dataObj = {};發生setter操作 vue監測到setter操作,通知相關指令執行更新操作 self.dataObj['text'] = 'new text';賦值語句 指令更新開始執行

所以真正的觸發更新操作是self.dataObj = {};這一句引起的,所以單看上述例子,具有響應式特性的數據只有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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 黔西县| 巴东县| 邢台市| 蚌埠市| 延庆县| 渝中区| 洛宁县| 长沙县| 鄄城县| 滕州市| 云浮市| 裕民县| 行唐县| 阜南县| 甘南县| 肥乡县| 罗源县| 聂拉木县| 象州县| 闽侯县| 弥渡县| 东乡县| 宝兴县| 页游| 商河县| 浮梁县| 方城县| 佛坪县| 新蔡县| 奉化市| 舒城县| 苗栗市| 庆城县| 兴安县| 顺昌县| 靖西县| 宜兰市| 锡林浩特市| 金堂县| 渭南市| 临泽县|