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

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

 更新時(shí)間:2022年09月18日 08:44:34   作者:xiaoxiaoikhoudvan  
這篇文章主要給大家介紹了關(guān)于vue中data的代理和監(jiān)聽的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(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}} )//括號(hào)里是匿名對(duì)象,無(wú)法訪問

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 成功

這樣寫,別人就無(wú)法直接修改data.n里的值,但是還是有一個(gè)問題,如果用接下來的寫法,別人還是可以繞過代理,對(duì)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()對(duì)data做的代理和監(jiān)聽

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

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

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    Vue3造輪子之Typescript配置highlight過程

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

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

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

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

    Vue.js 提供了一個(gè)方法 watch,它用于觀察Vue實(shí)例上的數(shù)據(jù)變動(dòng)。下面這篇文章主要給大家介紹了關(guān)于Vue.js中關(guān)于偵聽器(watch)的高級(jí)用法的相關(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)行過渡動(dòng)畫,需要的朋友可以參考下
    2020-02-02
  • Vue項(xiàng)目中定義全局變量的幾種常用方法總結(jié)

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

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

最新評(píng)論

正安县| 常宁市| 雷州市| 宁津县| 邵东县| 南汇区| 巩义市| 广昌县| 德化县| 巴南区| 台北市| 靖边县| 达日县| 侯马市| 定远县| 鄄城县| 白朗县| 沧源| 新余市| 高淳县| 清水河县| 阳新县| 永修县| 闻喜县| 清镇市| 滁州市| 嘉定区| 东港市| 城固县| 邳州市| 保山市| 榆社县| 崇义县| 墨竹工卡县| 乌兰县| 常熟市| 桂林市| 遂川县| 桃江县| 广安市| 莱阳市|