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

Vue數(shù)據(jù)代理的原理和實現(xiàn)

 更新時間:2022年11月07日 14:33:46   作者:亦世凡華、  
數(shù)據(jù)代理是什么?通過一個對象代理,對另一個對象中屬性的操作,簡單就是說:可以通過?對象b?對?對象a?中的屬性進行操作,這里我學(xué)到的數(shù)據(jù)代理是用Object.defineProperty這個方法進行操作

Object.defineProperty

defineProperty方法會直接在一個對象上定義一個新屬性,或者修改另一個對象的現(xiàn)有屬性,并返回此對象,通常使用 get 進行讀取,用 set 進行修改。

注意:defineProperty定義的屬性是不能進行枚舉(不能參與遍歷)的

<body>
    <script>
        let person = {
            name:'張三',
            sex:'男'
        }
        Object.defineProperty(person,'age',{
            value:18
        })
        console.log(Object.keys(person));
        console.log(person);
    </script>
</body>

當然,defineProperty內(nèi)部的屬性我們自己控制,可以根據(jù)需求進行一定修改,如下:

Object.defineProperty(person,'age',{
    value:18,
    enumerable:true, //控制屬性是否可以枚舉,默認值是false
    writable:true, //控制屬性是否可以被修改,默認值是false
    configurable:true, //控制屬性是否可以被刪除,默認值是false
})

definedProperty最重要的點就是get和set了,如下:

<script>
    let number = 18
    let person = {
        name:'張三',
        sex:'男'
    }
    Object.defineProperty(person,'age',{
        // 當有人讀取person的age屬性時,get函數(shù)(getter)就會被調(diào)用,且返回值就是age值
        get(){
            console.log('有人讀取了age屬性');
            return number
        },
        // 當有人修改person的age屬性時,set函數(shù)(setter)就會被調(diào)用,且會收到修改的具體值
        set(value){
            console.log('有人修改了age屬性,且值是',value);
            number = value
        }
    })
</script>

根據(jù)上文的簡述,我們理解數(shù)據(jù)代理就是:通過一個對象代理對另一個對象中屬性的操作(讀/寫)

<script>
    let obj = {x:100}
    let obj1 = {y:200}
    Object.defineProperty(obj1,'x',{
        get(){
            return obj.x
        },
        set(value){
            obj.x = value
        }
    })
</script>

那么在Vue中如何應(yīng)用數(shù)據(jù)代理呢

<body>
    <div id="root">
        <h2>姓名:{{name}}</h2>
        <h2>年齡:{{age}}</h2>
    </div>
    <script src="/Vue.js/vue.js"></script>
    <script>
        Vue.config.productionTip = false; //阻止 vue 在啟動時生成生產(chǎn)提示
        new Vue({
            el:'#root',
            data:{
                name:'張三',
                age:18
            }
        })
    </script> 
</body>

可以看出 vm 身上有我們data里面的name和age屬性,所以當我們訪問data上面的name或age的時候,getter開始工作;如果通過vm去修改這個name或age時,setter開始工作。即在data里面的數(shù)據(jù)是有自己的get和set,如下:

get的實現(xiàn):很簡單,當我們修改data.name的時候,我們在查看name的時候,name的值就是data.name的值,如下:

set的實現(xiàn):當我們進行修改name的時候,直接在控制臺修改name的值。

name的值的的確確是被修改了也渲染到頁面上去了,但我們怎么保證是data.name里面的name也被真真修改了呢?現(xiàn)在分析一下,data里面的name到底改沒改。

注意:我們不能直接在控制臺輸入data.name來查看,因為data僅僅是Vue里面配置項的一個屬性,并不是全局變量,是不能進行訪問的,如果訪問會報下面這樣的錯誤。

那么我們?nèi)绾文玫絛ata里面的name呢?在Vue中vm會把data里面的數(shù)據(jù)存在 _data 里面,所以說vm._data的data就是我們存放數(shù)據(jù)的data,那么如何驗證呢?既然我們不能訪問到Vue里面的data,那么我們把Vue里面的data的數(shù)據(jù)給寫到全局變量里面,然后Vue再引用全局上的data,這樣我們就可以驗證,Vue自帶的 _data 的數(shù)據(jù)是不是和Vue實例里面的data數(shù)據(jù)相等。

<script>
    Vue.config.productionTip = false; //阻止 vue 在啟動時生成生產(chǎn)提示
    let data = {
        name:'張三',
        age:18
    }
    const vm = new Vue({
        data
    })
    vm.$mount('#root')
    // 接下來我們驗證 vm._data = options.data = data 是不是true;options.data就是Vue里面配置項的data;data就是我們定義在外面的data
    console.log(Boolean(vm._data = vm.data = data)); //true
</script>

數(shù)據(jù)代理說白了就是把data里面的數(shù)據(jù)放一份到 vm 上面,目的就是為了當編碼更方便。

總結(jié)

Vue中的數(shù)據(jù)代理:

通過vm對象來代理data對象中屬性的操作(讀/寫)

Vue中數(shù)據(jù)代理的好處:

更加方便的操作data中的數(shù)據(jù)

基本原理:

通過Object.defineProperty()把data對象上所有屬性添加到vm上。為每個添加到vm上的屬性都指定一個getter/setter。在getter/setter內(nèi)部去操作(讀/寫)data中對應(yīng)的屬性。

到此這篇關(guān)于Vue數(shù)據(jù)代理的原理和實現(xiàn)的文章就介紹到這了,更多相關(guān)Vue數(shù)據(jù)代理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue實現(xiàn)按鈕旋轉(zhuǎn)和移動位置的實例代碼

    Vue實現(xiàn)按鈕旋轉(zhuǎn)和移動位置的實例代碼

    這篇文章主要介紹了Vue實現(xiàn)按鈕旋轉(zhuǎn)和移動位置的實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • Vue自定義指令實現(xiàn)彈窗拖拽四邊拉伸及對角線拉伸效果

    Vue自定義指令實現(xiàn)彈窗拖拽四邊拉伸及對角線拉伸效果

    小編最近在做一個vue前端項目,需要實現(xiàn)彈窗的拖拽,四邊拉伸及對角線拉伸,以及彈窗邊界處理功能,本文通過實例代碼給大家分享我的實現(xiàn)過程及遇到問題解決方法,感興趣的朋友一起看看吧
    2021-08-08
  • vue props對象validator自定義函數(shù)實例

    vue props對象validator自定義函數(shù)實例

    今天小編就為大家分享一篇vue props對象validator自定義函數(shù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Vue數(shù)字相加、相減精度丟失處理3種方法

    Vue數(shù)字相加、相減精度丟失處理3種方法

    這篇文章主要給大家介紹了關(guān)于Vue數(shù)字相加、相減精度丟失處理3種方法的相關(guān)資料,前端在操作加減乘除計算時,經(jīng)常會出現(xiàn)精度缺失問題,有時會顯示為科學(xué)計數(shù)的樣式,需要的朋友可以參考下
    2023-08-08
  • Vue組件設(shè)計-Sticky布局效果示例

    Vue組件設(shè)計-Sticky布局效果示例

    這篇文章主要介紹了Vue組件設(shè)計-Sticky布局,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • Vue+Element-UI實現(xiàn)上傳圖片并壓縮

    Vue+Element-UI實現(xiàn)上傳圖片并壓縮

    這篇文章主要為大家詳細介紹了Vue+Element-UI實現(xiàn)上傳圖片并壓縮功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Vue作用域插槽實現(xiàn)方法及作用詳解

    Vue作用域插槽實現(xiàn)方法及作用詳解

    這篇文章主要介紹了Vue作用域插槽實現(xiàn)方法及作用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • vue開發(fā)公共組件之返回頂部

    vue開發(fā)公共組件之返回頂部

    這篇文章主要為大家詳細介紹了vue開發(fā)公共組件之返回頂部,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Vue使用fabric.js實現(xiàn)局部截圖與大圖預(yù)覽功能

    Vue使用fabric.js實現(xiàn)局部截圖與大圖預(yù)覽功能

    這篇文章主要為大家詳細介紹了Vue如何使用fabric.js實現(xiàn)局部截圖與el-image-viewer大圖預(yù)覽功能,文中的示例代碼講解詳細,感興趣的可以了解下
    2024-02-02
  • vue使用swiper的時候第二輪事件不會觸發(fā)問題

    vue使用swiper的時候第二輪事件不會觸發(fā)問題

    這篇文章主要介紹了vue使用swiper的時候第二輪事件不會觸發(fā)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評論

碌曲县| 绿春县| 巩义市| 广水市| 民乐县| 天津市| 界首市| 日照市| 和平县| 银川市| 苏州市| 巩留县| 房产| 晋州市| 辽宁省| 聂拉木县| 深州市| 肇州县| 观塘区| 苍梧县| 富顺县| 大埔县| 荣成市| 容城县| 措勤县| 长泰县| 大同市| 泾川县| 建德市| 禄劝| 株洲县| 锡林郭勒盟| 淳化县| 永兴县| 河间市| 五莲县| 宣武区| 汉川市| 柏乡县| 文成县| 太白县|