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

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

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

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

假設(shè)現(xiàn)在有一個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 //接下來會有一個真正要存放的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 成功

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

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

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就是代理
}
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里的值,但是還是有一個問題,如果用接下來的寫法,別人還是可以繞過代理,對data中的數(shù)據(jù)直接進行修改:

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

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

function proxy2({data}){
    //新加的一段代碼主要進行監(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 成功

每次賦值前都會把data.n存在一個value里,執(zhí)行defineProperty時,因為名字相同都是n,所以舊的n會被新的n取代,所以任何人修改data里的數(shù)據(jù)都會被監(jiān)聽到,這就是 new Vue()對data做的代理和監(jiān)聽

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

1.會讓vm成為myData的代理

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論