欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

響應(yīng)式是什么

簡(jiǎn)而言之就是數(shù)據(jù)變頁(yè)面變

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

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

對(duì)象屬性攔截 (vue2.x)

Object.defineProperty

對(duì)象整體代理 (vue3.x)

Proxy

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

實(shí)現(xiàn)對(duì)象屬性攔截

字面量對(duì)象定義

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

Object.defineProperty對(duì)象定義

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

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

存在問(wèn)題演示

最后獲取name值沒(méi)有被改變

解決方案

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

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

結(jié)果驗(yàn)證

通用的劫持方案

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

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

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

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

let data = {
    name: '小蘭同學(xué)',
    age: 18,
    height:180
}
// 遍歷每一個(gè)屬性
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)說(shuō)明:這個(gè)地方實(shí)際上使用了閉包的特性,看下圖,在每一次的defineReactive函數(shù)執(zhí)行的時(shí)候,都會(huì)形成一塊獨(dú)立的函數(shù)作用域,傳入的value 因?yàn)殚]包的關(guān)系會(huì)常駐內(nèi)存,這樣一來(lái),每個(gè)defineReactive函數(shù)中的value 會(huì)作為各自set和get函數(shù)操作的局部變量

總結(jié)

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    vite中使用@配置路徑別名過(guò)程示例

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

    vue項(xiàng)目打包部署_nginx代理訪問(wèn)方法詳解

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

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

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

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

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

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

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

    Vue2模版編譯流程詳解

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

最新評(píng)論