最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Vue的數(shù)據(jù)響應(yīng)式

 更新時間:2021年05月15日 10:38:54   作者:lovin  
Vue.js的核心包括一套“響應(yīng)式系統(tǒng)”?!绊憫?yīng)式”,是指當數(shù)據(jù)改變后,Vue會通知到使用該數(shù)據(jù)的代碼。例如,視圖渲染中使用了數(shù)據(jù),數(shù)據(jù)改變后,視圖也會自動更新。

1. ES語法的getter和setter

在開始了解 Vue 的數(shù)據(jù)響應(yīng)式原理前應(yīng)該先搞清楚 ES語法 中的 getter 和 setter 方法的具體用法。

getter和setter 方法是以 get 和 set 關(guān)鍵字來為對象添加虛擬屬性的一種方式。這種屬性其實并不真實存在,而是以取值函數(shù) getter 和存值函數(shù) setter 來模擬的一種屬性。目的是對某個屬性設(shè)置存值函數(shù)和取值函數(shù),攔截該屬性的存取行為,以便于對該屬性的存取做一些限定處理。如下所示(以下代碼來源于 mdn)

getter 方法

const obj = {
  log: ['a', 'b', 'c'],
  get latest() { //在正常方法前加 get 關(guān)鍵字
    if (this.log.length == 0) {
      return undefined;
    }
    return this.log[this.log.length - 1];
  }
}

console.log(obj.latest);// 輸出 c,獲取的是屬性名不用帶括號

setter方法

const language = {
  set current(name) {
    this.log.push(name);
  },
  log: []
}

language.current = 'EN';
language.current = 'FA';

console.log(language.log);//輸出 Array ["EN", "FA"]

2. ES語法的 defineProperty

defineProperty 方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現(xiàn)有屬性, 并返回這個對象,可用于在一個對象定義好后為其修改或添加屬性。
語法為:

Object.defineProperty(obj, prop, descriptor)

添加常規(guī)屬性:

let data = {
  m: 0
}

Object.defineProperty(data, 'n', {
  value: 1 //添加屬性的 value 就是其值
})
console.log(`${data.n}`) //則會輸出n值為1

也可用來添加 getter 和 setter 的虛擬屬性

let data1 = {
    _n: 0
}

Object.defineProperty(data1, 'n', {
  get(){
    return this._n
  }, 
  set(value){
    if(value < 0) return
    this._n = value
  }//直接寫明 get / set 即可
}) //由于指明了虛擬屬性為 n,即 get n(){}、set n(value){},因此在函數(shù)定義時就不用再寫n了

3. Vue對數(shù)據(jù)的代理和監(jiān)聽

代理,即 proxy,簡單來說我自己的一些事情我自己不親自處理,而是交給一個人讓他去幫我做,那個做事的人就是代理。這個邏輯中有兩個關(guān)鍵點需要搞清楚,代理是處理操作的人,而其處理操作的事情不屬于他,而是屬于委托其代理的人的。

因此類比到 Vue數(shù)據(jù)代理 ,委托代理的是 data{} 數(shù)據(jù)對象,其找到代理就是 Vue實例vm ,data{} 數(shù)據(jù)對象要代理 vm 做的事情是管理 data{} 數(shù)據(jù)對象里數(shù)據(jù)操作。因此 data{} 數(shù)據(jù)對象只負責(zé)內(nèi)部數(shù)據(jù)的生產(chǎn)即可,對生產(chǎn)出來的數(shù)據(jù)的管理和操作全權(quán)交給 vm 處理。

那么 vm 如何對 data{} 數(shù)據(jù)對象里的數(shù)據(jù)進行控制和操作呢?換句話說,vm 如何在 data{} 數(shù)據(jù)對象里面的任意一個屬性值變化時都及時知道呢?

于是便用到了 ES 語法中的 getter和setter 方法,通過 getter和setter 方法控制的屬性的任何操作都會被這兩個函數(shù)檢測到,而 getter和setter 方法形成的屬性是虛擬屬性,真實并不存在,因此如果用戶想私自不經(jīng)過代理 vm 直接修改 data{} 數(shù)據(jù)對象的屬性也獲取不到對應(yīng)的實體屬性,只能通過 getter和setter 方法修改,那么其修改就必定被 vm 檢測到。

因此 vm 為了實現(xiàn)對 data{} 數(shù)據(jù)對象里數(shù)據(jù)的全部控制,就必須在 Vue實例 創(chuàng)建的時候?qū)鬟M來的 data{} 數(shù)據(jù)對象做一些處理,做的處理就是將 data{} 數(shù)據(jù)對象里的屬性都變成了 getter和setter 方法控制的虛擬屬性,并保存在代理數(shù)據(jù)對象 obj 并返回。

但為了不讓用戶直接修改原來的 data{} 屬性,也將原來的 data{} 對象的實體屬性全改變了,添加的虛擬屬性名字和實體屬性名一樣,就會用虛擬屬性覆蓋原來的實際屬性,用戶在修改屬性值是就是通過 getter和setter 方法修改的虛擬屬性。這樣一來 data{} 數(shù)據(jù)對象的全部屬性的任何變化都會被 Vue實例vm 檢測到。

let myData = {n:0}
let data = proxy({ data:myData }) // 類似于 let vm = new Vue({data: myData})

function proxy({data}/* 解構(gòu)賦值*/){
  let _n = data.n
  Object.defineProperty(data, 'n', { //覆蓋原來的data.n屬性
    get(){
      return _n
    },
    set(newValue){
      if(newValue<0)return
      _n = newValue
    }
  })// 改變data{}數(shù)據(jù)對象本身屬性,可通過閉包形成上下文,讓原來的實際屬性值存在閉包的上下文_n中
  
  const obj = {}
  Object.defineProperty(obj, 'n', {
    get(){
      return data.n
    },
    set(value){
      data.n = value
    }
  }) //添加data{}數(shù)據(jù)對象的代理,對data{}數(shù)據(jù)對象操作
  
  return obj // obj 就是data{}的代理
}

4. Vue的數(shù)據(jù)響應(yīng)式

所謂響應(yīng)式就是當事物發(fā)生變化時會根據(jù)變化做出相應(yīng)的反映。

Vue 中的數(shù)據(jù) data 是響應(yīng)式的,由上述 Vue 通過 Object.defineProperty()函數(shù) 來用 getter和setter方法 對 data 數(shù)據(jù)做了代理和監(jiān)聽,一旦數(shù)據(jù)發(fā)生變化,Vue 就會改變數(shù)據(jù)對應(yīng)的 UI 視圖,這就是 Vue的數(shù)據(jù)響應(yīng)式

但是 Vue 使用 Object.defineProperty 來設(shè)置監(jiān)聽,就只能對在 Vue實例化 時 data 對象里已經(jīng)存在的屬性設(shè)置監(jiān)聽,而對不存在的或者后來添加進去的屬性沒有進行監(jiān)聽。

為了解決這個問題,有兩種方法:

1. 將所有屬性都提前聲明好

2. 使用 Vue.set 和 this.$set 添加屬性

使用 Vue.set 和 this.$set 添加屬性是會通知 Vue 對這后添加的屬性也設(shè)置監(jiān)聽操作。

Vue.set('this.data','m','10')
this.$set('this.data','m','10')//為vm的data對象添加屬性m值為10

3.數(shù)組變異

對于數(shù)組的數(shù)據(jù)增加,無法控制其新增個數(shù)因此不能提前聲明所有數(shù)據(jù)值,而一個一個 set 又太麻煩,而且數(shù)組是常用的對象數(shù)據(jù)類型中的一種,因此 vue 的作者就對數(shù)組的增刪函數(shù)如 push 和 pop 等進行了篡改,用戶在使用 vue 中數(shù)組增刪時仍是用 push 和 pop ,但是里面進行了額外的處理,這幾個被篡改的 API 會對數(shù)組新增是數(shù)據(jù)代理監(jiān)聽并根據(jù)數(shù)據(jù)響應(yīng)改變 UI 視圖。

以上就是深入理解Vue的數(shù)據(jù)響應(yīng)式的詳細內(nèi)容,更多關(guān)于Vue的數(shù)據(jù)響應(yīng)式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue中插槽slot的使用方法與應(yīng)用場景詳析

    Vue中插槽slot的使用方法與應(yīng)用場景詳析

    這篇文章主要給大家介紹了關(guān)于Vue中插槽slot的使用方法與應(yīng)用場景的相關(guān)資料,插槽(Slot)是Vue提出來的一個概念,正如名字一樣,插槽用于決定將所攜帶的內(nèi)容,插入到指定的某個位置,從而使模板分塊,具有模塊化的特質(zhì)和更大的重用性,需要的朋友可以參考下
    2021-06-06
  • uniapp仿微信聊天界面效果實例(vue3組合式版本)

    uniapp仿微信聊天界面效果實例(vue3組合式版本)

    這篇文章主要介紹了uniapp仿微信聊天界面的相關(guān)資料,這里提及了一個時間工具包timeMethod.js,該工具包可能提供了一系列時間處理的功能,如格式化日期、計算時間差等,以便在消息格式中正確展示時間信息,使用此類工具包可以大大提高開發(fā)效率,需要的朋友可以參考下
    2024-10-10
  • vue的過濾器filter實例詳解

    vue的過濾器filter實例詳解

    本文通過實例代碼給大家介紹了vue的過濾器filter的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • vue中keep-alive多級路由緩存問題

    vue中keep-alive多級路由緩存問題

    本文主要介紹了vue中keep-alive多級路由緩存問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Nginx同一端口部署多個前后端分離的vue項目完整步驟

    Nginx同一端口部署多個前后端分離的vue項目完整步驟

    最近做項目結(jié)構(gòu)優(yōu)化,前端項目都是部署在nginx上,想實現(xiàn)同一個端口可以訪問多個前端項目,所以就有了本文,這篇文章主要給大家介紹了關(guān)于Nginx同一端口部署多個前后端分離的vue項目的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • Vue3 Pinia獲取全局狀態(tài)變量的實現(xiàn)方式

    Vue3 Pinia獲取全局狀態(tài)變量的實現(xiàn)方式

    這篇文章主要介紹了Vue3 Pinia獲取全局狀態(tài)變量的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • react+?ts?vite搭建及二次封裝請求的過程解析

    react+?ts?vite搭建及二次封裝請求的過程解析

    這篇文章主要介紹了react+?ts?vite搭建及二次封裝請求,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • vue.js實現(xiàn)h5機器人聊天(測試版)

    vue.js實現(xiàn)h5機器人聊天(測試版)

    這篇文章主要為大家詳細介紹了vue.js實現(xiàn)h5機器人聊天測試版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • vue實現(xiàn)商品詳情頁功能之商品選項卡

    vue實現(xiàn)商品詳情頁功能之商品選項卡

    這篇文章主要為大家詳細介紹了vue實現(xiàn)商品詳情頁功能之商品選項卡,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 淺談Vue為什么不能檢測數(shù)組變動

    淺談Vue為什么不能檢測數(shù)組變動

    這篇文章主要介紹了淺談Vue為什么不能檢測數(shù)組變動,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評論

钦州市| 法库县| 卢龙县| 麻栗坡县| 濮阳市| 余姚市| 志丹县| 改则县| 肇东市| 读书| 龙山县| 治县。| 神农架林区| 兴文县| 罗城| 搜索| 筠连县| 太康县| 枣阳市| 丹东市| 镶黄旗| 水富县| 长宁区| 定日县| 南岸区| 开化县| 灵宝市| 涡阳县| 兰考县| 郁南县| 广安市| 昂仁县| 左云县| 汕头市| 白朗县| 海门市| 铜川市| 微山县| 盘锦市| 尼木县| 安康市|