91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-10-11 12:44:18 來源:腳本之家 閱讀:149 作者:楊小福 欄目:web開發

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

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

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

模板

<div id="app">
    <h3>{{dataObj.text}}</h3>
</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屬性已經賦值,所以指令更新模板時得到的是新值。

具體流程如下所示:

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

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

對比示例:

模板

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

js

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

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

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

Vue.$set

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

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屬性是不具備響應式特性的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

聂荣县| 甘谷县| 惠水县| 武川县| 大同县| 湘西| 台江县| 商城县| 沂源县| 法库县| 紫阳县| 安吉县| 元阳县| 遂昌县| 石棉县| 仙居县| 南岸区| 巴马| 高阳县| 罗山县| 封开县| 海原县| 大石桥市| 溧阳市| 含山县| 资溪县| 兖州市| 德令哈市| 敦煌市| 自贡市| 丰城市| 临城县| 墨竹工卡县| 南城县| 九龙城区| 全州县| 鄂尔多斯市| 二连浩特市| 永登县| 张家界市| 扎赉特旗|