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

簡單聊一聊vue中data的代理和監(jiān)聽

 更新時(shí)間:2022年09月18日 08:44:34   作者:xiaoxiaoikhoudvan  
這篇文章主要給大家介紹了關(guān)于vue中data的代理和監(jiān)聽的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

接下來通過幾個(gè)需求的完成來一步步看看data中的代理和監(jiān)聽是怎么樣的

假設(shè)現(xiàn)在有一個(gè)data

let data0 = {
    n:0
}

需求一: 用 Object.defineProperty 定義 n

let data1 = {}
Object.defineProperty(data1, 'n',{
    value:0
})
console.log("需求1:",data1.n)//輸出結(jié)果:0

需求二:n不能小于0

let data2 = {}
data2._n = 0 //接下來會(huì)有一個(gè)真正要存放的n,所以先用 _n來存放 n的值
Object.defineProperty(data2, 'n',{
    get(){
        return this._n
    },
    set(value){
        if(value < 0){return}
        this._n = value
    }
})
console.log("需求2:",data2.n)//輸出結(jié)果:0
data2.n = -1
console.log(`需求2:${data2.n}  設(shè)置為 -1 失敗`)//輸出結(jié)果:需求2:0  設(shè)置為 -1 失敗
data2.n = 1
console.log(`需求2:${data2.n}  設(shè)置為 1 成功`)//輸出結(jié)果:需求2:1  設(shè)置為 1 成功

這樣寫有一個(gè)問題:如果有人直接修改 data2._n 呢?

所以就有了需求三:不暴露data中可以設(shè)置的屬性,而是使用一個(gè)代理

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 // 這個(gè)obj就是代理
}
console.log("需求3:",data3.n)//輸出結(jié)果:0
data3.n = -1
console.log(`需求3:${data3.n}  設(shè)置為 -1 失敗`)//輸出結(jié)果:需求3:0  設(shè)置為 -1 失敗
data3.n = 1
console.log(`需求3:${data3.n}  設(shè)置為 1 成功`)//輸出結(jié)果:需求3:1  設(shè)置為 1 成功

這樣寫,別人就無法直接修改data.n里的值,但是還是有一個(gè)問題,如果用接下來的寫法,別人還是可以繞過代理,對data中的數(shù)據(jù)直接進(jìn)行修改:

let myData = {n:0}
let data4 = proxy( {data:myData} )
myData.n = -1
console.log(`${data4.n}, 成功設(shè)置成了-1`) //輸出結(jié)果:`-1, 成功設(shè)置成了-1`

因此引出了需求四:就算用戶擅自修改myData,也要進(jìn)行攔截

function proxy2({data}){
    //新加的一段代碼主要進(jìn)行監(jiān)聽
    let value = data.n
    Object.defineProperty(data, 'n',{
    get(){
        return value
    },
    set(newValue){
        if(newValue < 0){return}
        value = newValue
    }
})

//接下來的代碼同需求三種的proxy
...
}
console.log("需求5:",data5.n)//輸出結(jié)果:0
data3.n = -1
console.log(`需求5:${data5.n}  設(shè)置為 -1 失敗`)//輸出結(jié)果:需求5:0  設(shè)置為 -1 失敗
data3.n = 1
console.log(`需求5:${data5.n}  設(shè)置為 1 成功`)//輸出結(jié)果:需求5:1  設(shè)置為 1 成功

每次賦值前都會(huì)把data.n存在一個(gè)value里,執(zhí)行defineProperty時(shí),因?yàn)槊窒嗤际莕,所以舊的n會(huì)被新的n取代,所以任何人修改data里的數(shù)據(jù)都會(huì)被監(jiān)聽到,這就是 new Vue()對data做的代理和監(jiān)聽

即當(dāng)我們寫 vm = new Vue({data:myData})時(shí),vue做了兩件事

1.會(huì)讓vm成為myData的代理

2.會(huì)對myData的所有屬性進(jìn)行監(jiān)控

總結(jié)

到此這篇關(guān)于vue中data的代理和監(jiān)聽的文章就介紹到這了,更多相關(guān)vue data的代理和監(jiān)聽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Element如何實(shí)現(xiàn)loading的方法示例

    Element如何實(shí)現(xiàn)loading的方法示例

    本文主要介紹了Element如何實(shí)現(xiàn)loading的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 使用jenkins一鍵打包發(fā)布vue項(xiàng)目的實(shí)現(xiàn)

    使用jenkins一鍵打包發(fā)布vue項(xiàng)目的實(shí)現(xiàn)

    這篇文章主要介紹了使用jenkins一鍵打包發(fā)布vue項(xiàng)目的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Vue框架TypeScript裝飾器使用指南小結(jié)

    Vue框架TypeScript裝飾器使用指南小結(jié)

    這篇文章主要介紹了Vue框架TypeScript裝飾器使用指南小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-02-02
  • Vue3引入SVG圖標(biāo)的流程步驟

    Vue3引入SVG圖標(biāo)的流程步驟

    我們在開發(fā) Vue 項(xiàng)目的時(shí)候會(huì)使用一些前端組件庫,例如 Element、Ant Design 等,這些組件庫雖然方便,但是也有一些缺點(diǎn),比如內(nèi)置的圖標(biāo)太少,例如我們開發(fā)醫(yī)療、財(cái)務(wù)、工程等一些前端項(xiàng)目,內(nèi)置的圖標(biāo)不能滿足我們的需求,所以我們常常在Vue項(xiàng)目中引入SVG圖標(biāo)
    2024-09-09
  • Vue3之路由跳轉(zhuǎn)與參數(shù)獲取方式

    Vue3之路由跳轉(zhuǎn)與參數(shù)獲取方式

    這篇文章主要介紹了Vue3之路由跳轉(zhuǎn)與參數(shù)獲取方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 從零搭建一個(gè)vite+vue3+ts規(guī)范基礎(chǔ)項(xiàng)目(搭建過程問題小結(jié))

    從零搭建一個(gè)vite+vue3+ts規(guī)范基礎(chǔ)項(xiàng)目(搭建過程問題小結(jié))

    這篇文章主要介紹了從零搭建一個(gè)vite+vue3+ts規(guī)范基礎(chǔ)項(xiàng)目,本項(xiàng)目已vite開始,所以按照vite官方的命令開始,對vite+vue3+ts項(xiàng)目搭建過程感興趣的朋友一起看看吧
    2022-05-05
  • Vue 單文件中的數(shù)據(jù)傳遞示例

    Vue 單文件中的數(shù)據(jù)傳遞示例

    本篇文章主要介紹了Vue 單文件中的數(shù)據(jù)傳遞示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • Vue3 實(shí)現(xiàn)雙盒子定位Overlay的示例

    Vue3 實(shí)現(xiàn)雙盒子定位Overlay的示例

    這篇文章主要介紹了Vue3 實(shí)現(xiàn)雙盒子定位Overlay的示例,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下
    2020-12-12
  • 前端實(shí)現(xiàn)簡單的sse封裝方式(React hook Vue3)

    前端實(shí)現(xiàn)簡單的sse封裝方式(React hook Vue3)

    這篇文章主要介紹了前端實(shí)現(xiàn)簡單的sse封裝方式(React hook Vue3),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • vue實(shí)現(xiàn)頭像上傳功能

    vue實(shí)現(xiàn)頭像上傳功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)頭像上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評論