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

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

 更新時間:2022年09月18日 08:44:34   作者:xiaoxiaoikhoudvan  
這篇文章主要給大家介紹了關(guān)于vue中data的代理和監(jiān)聽的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(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ù)直接進(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 成功

每次賦值前都會把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的所有屬性進(jìn)行監(jiān)控

總結(jié)

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

相關(guān)文章

  • 淺談vue.use()方法從源碼到使用

    淺談vue.use()方法從源碼到使用

    這篇文章主要介紹了淺談vue.use()方法從源碼到使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • vue動態(tài)渲染svg、添加點(diǎn)擊事件的實(shí)現(xiàn)

    vue動態(tài)渲染svg、添加點(diǎn)擊事件的實(shí)現(xiàn)

    這篇文章主要介紹了vue動態(tài)渲染svg、添加點(diǎn)擊事件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • vue項目使用js監(jiān)聽瀏覽器關(guān)閉、刷新及后退事件的方法

    vue項目使用js監(jiān)聽瀏覽器關(guān)閉、刷新及后退事件的方法

    這篇文章主要給大家介紹了關(guān)于vue項目使用js監(jiān)聽瀏覽器關(guān)閉、刷新及后退事件的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • vue中如何下載excel流文件及設(shè)置下載文件名

    vue中如何下載excel流文件及設(shè)置下載文件名

    這篇文章主要介紹了vue中如何下載excel流文件及設(shè)置下載文件名,對vue感興趣的同學(xué),可以參考下
    2021-05-05
  • Vue3造輪子之Typescript配置highlight過程

    Vue3造輪子之Typescript配置highlight過程

    這篇文章主要介紹了Vue3造輪子之Typescript配置highlight過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Vue項目中keepAlive的使用說明(超級實(shí)用版)

    Vue項目中keepAlive的使用說明(超級實(shí)用版)

    這篇文章主要介紹了Vue項目中keepAlive的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue.js中關(guān)于偵聽器(watch)的高級用法示例

    Vue.js中關(guān)于偵聽器(watch)的高級用法示例

    Vue.js 提供了一個方法 watch,它用于觀察Vue實(shí)例上的數(shù)據(jù)變動。下面這篇文章主要給大家介紹了關(guān)于Vue.js中關(guān)于偵聽器(watch)的高級用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-05-05
  • 關(guān)于Vue 3.0引入百度地圖不兼容的解決辦法

    關(guān)于Vue 3.0引入百度地圖不兼容的解決辦法

    這篇文章主要介紹了關(guān)于Vue 3.0引入百度地圖不兼容的解決辦法,本文通過實(shí)例代碼給大家分享解決方法,需要的朋友可以參考下
    2022-08-08
  • Vue中多元素過渡特效的解決方案

    Vue中多元素過渡特效的解決方案

    本文將詳細(xì)介紹通過Vue使多元素進(jìn)行過渡動畫,需要的朋友可以參考下
    2020-02-02
  • Vue項目中定義全局變量的幾種常用方法總結(jié)

    Vue項目中定義全局變量的幾種常用方法總結(jié)

    在項目中經(jīng)常有些函數(shù)和變量是需要復(fù)用,比如說網(wǎng)站服務(wù)器地址,從后臺拿到的用戶的登錄token,用戶的地址信息等,這時候就需要設(shè)置一波全局變量,這篇文章主要給大家介紹了關(guān)于Vue項目中定義全局變量的幾種常用方法的相關(guān)資料,需要的朋友可以參考下
    2023-12-12

最新評論

桂平市| 安吉县| 长宁区| 平安县| 绥芬河市| 息烽县| 汝阳县| 灵璧县| 丹寨县| 湘阴县| 收藏| 秦皇岛市| 巧家县| 安宁市| 龙门县| 黄梅县| 辽宁省| 化德县| 乌审旗| 化隆| 石河子市| 塔河县| 侯马市| 都安| 永济市| 融水| 遵义县| 闵行区| 富蕴县| 靖江市| 罗平县| 兖州市| 汤阴县| 南通市| 山东| 崇仁县| 海城市| 古丈县| 新昌县| 滕州市| 姚安县|