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

Vue數(shù)據(jù)代理的實現(xiàn)流程逐步講解

 更新時間:2023年01月06日 16:03:06   作者:BraveWangDev  
通過一個對象代理對另一個對象中的屬性的操作(讀/寫),就是數(shù)據(jù)代理。要搞懂Vue數(shù)據(jù)代理這個概念,那我們就要從Object.defineProperty()入手,Object.defineProperty()是Vue中比較底層的一個方法,在數(shù)據(jù)劫持,數(shù)據(jù)代理以及計算屬性等地方都或多或少的用到了本函數(shù)

一,前言

上篇,主要介紹了 Vue 數(shù)據(jù)初始化流程中,數(shù)組類型的數(shù)據(jù)劫持是如何實現(xiàn)的,核心思路如下:

出于對性能的考慮,Vue 沒有對數(shù)組采用 Object.defineProperty 進行遞歸劫持,而是對能夠?qū)е略瓟?shù)組變化的 7 個方法進行了攔截和重寫,實現(xiàn)了對數(shù)組的數(shù)據(jù)劫持

至此,已經(jīng)完成了對響應(yīng)式數(shù)據(jù)(對象和數(shù)組)的劫持(深層劫持)操作

本篇,繼續(xù)介紹 Vue 數(shù)據(jù)初始化流程中, Vue 實例上數(shù)據(jù)代理的實現(xiàn)

二,數(shù)據(jù)代理的實現(xiàn)

1,Vue 是如何操作數(shù)據(jù)的

在 Vue 中,是可以在外部直接通過 vm 實例進行數(shù)據(jù)訪問和操作:

let vm = new Vue({
  el: '#app',
  data() {
    return { message: 'Hello Vue', obj: { key: "val" }, arr:[1,2,3]}
  }
});
console.log(vm.message)
console.log(vm.arr.push(4))

拋出問題:vm.message 等價于 $options.data.message,是如何實現(xiàn)的?

2,當前是如何操作數(shù)據(jù)的

當前代碼,外部的 vm 實例只能拿到 vm. o p t i o n s ,拿到 d a t a 需要 v m . options,拿到 data 需要 vm. options,拿到data需要vm.options.data

// src/state.js#initData
function initData(vm) {
    let data = vm.$options.data;
    data = isFunction(data) ? data.call(vm) : data;
    observe(data);
    data.message
    data.arr.push(4); 
}

要想實現(xiàn) vm.message 和 $options.data.message 等效

相當于將 vm 實例操作代理到 $options.data 上,即實現(xiàn)數(shù)據(jù)代理

3,數(shù)據(jù)代理的思路

為了讓外部的 vm 實例能夠拿到觀測后的 data,將處理后的 data 直接掛載到 vm 上

// src/state.js#initData
function initData(vm) {
    let data = vm.$options.data;
    data = vm._data = isFunction(data) ? data.call(vm) : data;
    observe(data);
}

這樣,vm 實例就能夠在外部通過 vm._data.message 獲取到 data.message

接下來,再做一次代理,將 vm 實例操作(vm.message),代理到 vm._data 上即可

4,數(shù)據(jù)代理的實現(xiàn)

通過 Object.defineProperty 對 _data 中的數(shù)據(jù)操作進行劫持

即:vm.message 在 vm 實例上取值時,將它代理到 vm._data 上取值

// src/state.js#initData
function initData(vm) {
    let data = vm.$options.data;
    data = vm._data = isFunction(data) ? data.call(vm) : data;
    observe(data);
    // 當 vm.message 在 vm 實例上取值時,將它代理到vm._data上去取
    for(let key in data){
        Proxy(vm, key, '_data')
    }
}
// src/state.js#Proxy
/**
 * 代理方法
 *  當取 vm.key 時,將它代理到 vm._data上去取
 * @param {*} vm        vm 實例
 * @param {*} key       屬性名
 * @param {*} source    代理目標,這里是vm._data
 */
function Proxy(vm, key, source) {
    Object.defineProperty(vm, key, {
        get(){
            return vm[source][key]
        },
        set(newValue){
            vm[source][key] = newValue;
        }
    })
}

5,數(shù)據(jù)代理的測試

let vm = new Vue({
  el: '#app',
  data() {
    return { message: 'Hello Vue', obj: { key: "val" }, arr:[1,2,3]}
  }
});
console.log(vm)
console.log(vm.message)

觀察打印結(jié)果:

獲取 vm 實例時,會通過 get 方法將 _data 全部屬性打印出來

當前 vm 實例上,包含 data 全部屬性及對應(yīng)的 get、set 方法

這樣,就實現(xiàn)了數(shù)據(jù)代理:

當從 vm 實例取值時,就會被代理到 vm._data 取值

三,結(jié)尾

本篇主要介紹了 Vue 數(shù)據(jù)初始化流程中,Vue 實例上數(shù)據(jù)代理的實現(xiàn),核心思路如下:

  • 將 data 暴露在 vm._data 實例屬性上
  • 利用 Object.defineProperty 將 vm.xxx 操作代理到 vm._data 上

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

相關(guān)文章

  • Vue組件上使用v-model之單選框

    Vue組件上使用v-model之單選框

    這篇文章主要介紹了Vue組件上使用v-model之單選框,代碼分為子組件內(nèi)容和父組件內(nèi)容,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • vue項目根據(jù)不同環(huán)境進行設(shè)置打包命令的方法

    vue項目根據(jù)不同環(huán)境進行設(shè)置打包命令的方法

    這篇文章主要介紹了vue項目根據(jù)不同環(huán)境進行設(shè)置打包命令,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-11-11
  • Vue通過input篩選數(shù)據(jù)

    Vue通過input篩選數(shù)據(jù)

    這篇文章主要為大家詳細介紹了Vue通過input篩選數(shù)據(jù)的相關(guān)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Vue3?中實現(xiàn)元素拖拽功能

    Vue3?中實現(xiàn)元素拖拽功能

    這篇文章主要介紹了在Vue3中實現(xiàn)飄逸的元素拖拽,在本次案例中需要認真思考對應(yīng)的幾個坐標和移動時坐標如何更新,事件的使用要成對出現(xiàn),如何在這個拖拽的 Icon 上增加點擊事件時還需要多做一些處理,需要的朋友可以參考下
    2023-07-07
  • 使用axios請求時,發(fā)送formData請求的示例

    使用axios請求時,發(fā)送formData請求的示例

    今天小編就為大家分享一篇使用axios請求時,發(fā)送formData請求的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • vue動態(tài)設(shè)置img的src路徑實例

    vue動態(tài)設(shè)置img的src路徑實例

    今天小編就為大家分享一篇vue動態(tài)設(shè)置img的src路徑實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • 派發(fā)器抽離vue2單組件中的大量邏輯技巧

    派發(fā)器抽離vue2單組件中的大量邏輯技巧

    這篇文章主要為大家介紹了派發(fā)器抽離vue2單組件中的大量邏輯技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 詳解Vue如何通過URL傳遞與獲取參數(shù)

    詳解Vue如何通過URL傳遞與獲取參數(shù)

    Vue Router 路由實際上就是一種映射關(guān)系,例如,多個選項卡之間的切換就可以使用路由功能來實現(xiàn),在實際的開發(fā)中,經(jīng)常需要通過URL來傳遞參數(shù),同時在 JavaScript 腳本中需要獲取URL中的參數(shù),下面將介紹 Vue 項目中,如何通過 URL 對參數(shù)進行傳遞與獲取,需要的朋友可以參考下
    2024-09-09
  • vue的指令和插值問題匯總

    vue的指令和插值問題匯總

    Vue?是一套用于構(gòu)建用戶界面的漸進式框架,Vue?的核心庫只關(guān)注視圖層,不僅易于上手,還便于與第三方庫或既有項目整合,這篇文章主要介紹了vue的指令和插值總結(jié),需要的朋友可以參考下
    2022-10-10
  • vue中前端如何實現(xiàn)pdf預(yù)覽功能(含vue-pdf插件用法)

    vue中前端如何實現(xiàn)pdf預(yù)覽功能(含vue-pdf插件用法)

    這篇文章主要給大家介紹了vue中前端如何實現(xiàn)pdf預(yù)覽功能的相關(guān)資料,文中包含vue-pdf插件用法,在前端開發(fā)中,很多時候我們需要進行pdf文件的預(yù)覽操作,需要的朋友可以參考下
    2023-07-07

最新評論