亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2022年05月17日 09:45:23   作者:幾何心涼  
應(yīng)用會對用戶的操作進(jìn)行反饋,就叫響應(yīng)式,數(shù)據(jù)變化會實時改變UI,就叫數(shù)據(jù)響應(yīng)式,修改Vue實例中的數(shù)據(jù)時,視圖會重新渲染,就是Vue的數(shù)據(jù)響應(yīng)式

響應(yīng)式是什么

簡而言之就是數(shù)據(jù)變頁面變

如何實現(xiàn)數(shù)據(jù)響應(yīng)式

在Javascript里實現(xiàn)數(shù)據(jù)響應(yīng)式一般有倆種方案,分別對應(yīng)著vue2.x 和 vue3.x使用的方式,他們分別是:

對象屬性攔截 (vue2.x)

Object.defineProperty

對象整體代理 (vue3.x)

Proxy

其中對象屬性攔截,道理都是相通的

實現(xiàn)對象屬性攔截

字面量對象定義

let data = {
    name:'小蘭同學(xué)'
}

Object.defineProperty對象定義

let data = {}
Object.defineProperty(data,'name',{
    // 訪問name屬性就會執(zhí)行此方法 返回值就是獲取到的值
    get(){
       console.log('name屬性被獲取了')
       return '小蘭同學(xué)'
    },
    // 設(shè)置新值就會執(zhí)行此方法 newVal就是設(shè)置的新值
    set(newVal){
       console.log('name屬性被設(shè)置新值了')
       console.log(newVal)
    }
})

我們可以通過 data.name 去獲取值,也可以通過 data.name=‘小趙同學(xué)’去賦值

存在問題演示

最后獲取name值沒有被改變

解決方案

我們可以 通過一個中間變量 _name 來中轉(zhuǎn)get函數(shù)和set函數(shù)之間的聯(lián)動

let data = {}
let _name = '小蘭同學(xué)'
Object.defineProperty(data,'name',{
    // 訪問name屬性就會執(zhí)行此方法 返回值就是獲取到的值
    get(){
       console.log('name屬性被獲取了')
       return _name
    },
    // 設(shè)置新值就會執(zhí)行此方法 newVal就是設(shè)置的新值
    set(newVal){
       console.log('name屬性被設(shè)置新值了')
       console.log(newVal)
       _name = newVal
    }
})

結(jié)果驗證

通用的劫持方案

大家想想看,如果現(xiàn)在有一份已經(jīng)聲明好了數(shù)據(jù)的對象,我們?nèi)绾瓮ㄟ^劫持的方法把每一個屬性都變成setter和getter的形式

下面是一份已經(jīng)聲明好的數(shù)據(jù)

let data = {
    name: '小蘭同學(xué)',
    age: 18,
    height:180
}

我們想讓里面所有的屬性都變成響應(yīng)式的,并且get和set方法中對于每個屬性值的操作是連通的

let data = {
    name: '小蘭同學(xué)',
    age: 18,
    height:180
}
// 遍歷每一個屬性
Object.keys(data).forEach((key)=>{
    // key 屬性名
    // data[key] 屬性值
    defineReactive(data,key,data[key])
})
// 響應(yīng)式轉(zhuǎn)化方法
function defineReactive(data,key,value){
    Object.defineProperty(data,key,{
        get(){
           return value
        },
        set(newVal){
          value = newVal 
        }
    })
}

結(jié)構(gòu)說明:這個地方實際上使用了閉包的特性,看下圖,在每一次的defineReactive函數(shù)執(zhí)行的時候,都會形成一塊獨立的函數(shù)作用域,傳入的value 因為閉包的關(guān)系會常駐內(nèi)存,這樣一來,每個defineReactive函數(shù)中的value 會作為各自set和get函數(shù)操作的局部變量

總結(jié)

  • 所謂的響應(yīng)式其實就是攔截對象屬性的訪問和設(shè)置,插入一些我們自己想要做的事情
  • 在Javascript中能實現(xiàn)響應(yīng)式攔截的方法有倆種,Object.defineProperty方法和Proxy對象代理
  • 回歸到vue2.x中的data配置項,只要放到了data里的數(shù)據(jù),不管層級多深不管你最終會不會用到這個數(shù)據(jù)都會進(jìn)行遞歸響應(yīng)式處理,所以要求我們?nèi)绶潜匾?,盡量不要添加太多的冗余數(shù)據(jù)在data中
  • 需要了解vue3.x中,解決了2中對于數(shù)據(jù)響應(yīng)式處理的無端性能消耗,使用的手段是Proxy劫持對象整體 + 惰性處理(用到了才進(jìn)行響應(yīng)式轉(zhuǎn)換)

到此這篇關(guān)于Vue深入講解數(shù)據(jù)響應(yīng)式原理的文章就介紹到這了,更多相關(guān)Vue數(shù)據(jù)響應(yīng)式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在uni-app中使用vant組件的方法

    在uni-app中使用vant組件的方法

    最近在做uni-app的時候需要用到vant組件,在網(wǎng)上看到了很多的使用vant組件的方法,但是講解的大多繁瑣,或者無法使用,現(xiàn)把最新,最實用的vant組件的使用方法分享給大家,需要的朋友可以參考下
    2023-02-02
  • vue封裝axios與api接口管理的完整步驟

    vue封裝axios與api接口管理的完整步驟

    在實際的項目中,和后臺的數(shù)據(jù)交互是少不了的,我通常使用的是 axios 庫,所以下面這篇文章主要給大家介紹了關(guān)于vue封裝axios與api接口管理的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • vue中使用better-scroll實現(xiàn)滑動效果及注意事項

    vue中使用better-scroll實現(xiàn)滑動效果及注意事項

    這篇文章主要介紹了vue中使用better-scroll實現(xiàn)滑動效果,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • vue 中自定義指令改變data中的值

    vue 中自定義指令改變data中的值

    這篇文章主要介紹了vue 中自定義指令改變data中的值,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-06-06
  • vite中使用@配置路徑別名過程示例

    vite中使用@配置路徑別名過程示例

    這篇文章主要為大家介紹了vite中使用@配置路徑別名過程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • vue項目打包部署_nginx代理訪問方法詳解

    vue項目打包部署_nginx代理訪問方法詳解

    今天小編就為大家分享一篇vue項目打包部署_nginx代理訪問方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vue 項目部署到服務(wù)器的問題解決方法

    Vue 項目部署到服務(wù)器的問題解決方法

    本篇文章主要介紹了Vue 項目部署到服務(wù)器的問題解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • vue 使用v-if切換輸入框時導(dǎo)致輸入框的數(shù)據(jù)內(nèi)容沒有清空的問題解決(兩種解決方法)

    vue 使用v-if切換輸入框時導(dǎo)致輸入框的數(shù)據(jù)內(nèi)容沒有清空的問題解決(兩種解決方法)

    這篇文章主要介紹了vue 使用v-if切換輸入框時導(dǎo)致輸入框的數(shù)據(jù)內(nèi)容沒有清空的問題解決,本文給大家分享兩種解決方法,需要的朋友可以參考下
    2023-05-05
  • vue中watch監(jiān)聽不到變化的解決

    vue中watch監(jiān)聽不到變化的解決

    本文主要介紹了vue中watch監(jiān)聽不到變化的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Vue2模版編譯流程詳解

    Vue2模版編譯流程詳解

    vue中有一張響應(yīng)式系統(tǒng)的流程圖,vue會將模板語法編譯成render函數(shù),通過render函數(shù)渲染生成Virtual?dom,但是官方并沒有對模板編譯有詳細(xì)的介紹,這篇文章帶大家一起學(xué)習(xí)下vue的模板編譯
    2023-07-07

最新評論