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

溫馨提示×

溫馨提示×

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

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

Vue data的數據響應式到底是如何實現的

發布時間:2020-09-05 11:20:11 來源:腳本之家 閱讀:192 作者:Oliver 欄目:web開發

研究過程

一般形式

data:{ n:0 } :以這樣的方式存儲數據,vue能夠監聽其變化嗎?顯然是不能的。

使用Obj.defineProperty

let data1 = {}

Object.defineProperty(data1, 'n', {
value: 0  
})

為什么要使用defineProperty呢?這不是把一般形式復雜化了嗎?

引出主角getter setter。

如果我們想對數據監聽進行處理呢?(假設修改的數據必須>=0)

let data2 = {}
data2._n = 0

Object.defineProperty(data2,'n',{
  get(){ return this._n },
  set(value){
    if(value<0) return //在此處可以對數據的修改進行操作
    this._n = value
  }
})

使用代理

如果對方直接修改data2._n怎么辦?我們讓data2變成匿名對象!

let data3 = proxy({ data:{n:0} }) //括號里是匿名對象,無法訪問
function proxy({data}){
 const obj = {}
 Object.defineProperty(obj, 'n', {
  get(){
    return data.n
  },
  set(value){
    if(value<0)return
    data.n = value
   }
 })
 return obj // obj 就是代理
}

代理是什么?

  • 對data的屬性的讀寫,全權交給另一個對象obj負責,那么obj就是data的代理
  • data.n不使用,偏要使用obj.n來操作data.n

如果用戶自己給匿名對象起了個名字怎么辦呢?

MyData = { n:0 }
let data3 = proxy({ data:MyData })
MyData.n = -1
 //成功賦值為-1

這種情況,我們也要進行攔截處理。

//在4.中的proxy函數中加入這幾行
let value = data.n
 Object.defineProperty(data, 'n', {
   get(){
     return value
   },
   set(newValue){
     if(newValue<0)return
     value = newValue
   }
 })

這樣,我們就對data進行了監聽。

data域的一個bug

new Vue({
  data:{
    obj:{
      a:0
    }
  },
  template:`
    <div @click="set">{{ obj.b }}</div>
  `,
  methods:{
    set(){
      this.obj.b = 1
    }
  }
})
  //bug:vue無法監聽一開始data域中不存在的obj.b

解決方法:

data的初始化中加入b

data:{
  obj:{
    a:0,
    b:undefined 
    //注意,vue中的null和undefined都不會被渲染出來
  }
}

使用Vue.set(this.obj,'b',1)

數組的長度又不固定,怎么提前聲明?

  1. 使用Vue.set (不推薦)
  2. 使用this.array.push (被Vue改寫過的push,實現了代理和監聽)

詳見vue文檔,變異方法 章節

總結

//看看下面的代碼,發現了什么?

let data = proxy({ data:myData5 })
let vm = new Vue({ data: myData })

Vue正是使用了這種代理和監聽的設計模式,形成的數據響應式。

流程:聲明數據 => 監聽數據 => 代理數據 => 返回數據

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

向AI問一下細節

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

AI

万山特区| 台东市| 宁陵县| 临沭县| 济阳县| 宿松县| 吕梁市| 义乌市| 城口县| 嵩明县| 达尔| 项城市| 丰原市| 元氏县| 竹溪县| 滁州市| 嘉定区| 开封县| 黑龙江省| 崇阳县| 广宁县| 德钦县| 营口市| 仁怀市| 太和县| 资源县| 东方市| 苍溪县| 枣强县| 渭南市| 秭归县| 龙游县| 游戏| 秦安县| 封丘县| 柘荣县| 台南市| 开封县| 吕梁市| 佛山市| 博客|