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

vue數(shù)據(jù)響應式原理重寫函數(shù)實現(xiàn)數(shù)組響應式監(jiān)聽

 更新時間:2023年05月16日 11:12:27   作者:-耿瑞-  
Vue的通過數(shù)據(jù)劫持的方式實現(xiàn)數(shù)據(jù)的雙向綁定,即使用Object.defineProperty()來實現(xiàn)對屬性的劫持,但是Object.defineProperty()中的setter是無法直接實現(xiàn)數(shù)組中值的改變的劫持行為的,需要的朋友可以參考下

output.js代碼:

import { observe } from "./dataResp"
const output = () => {
    var obj = {
        data: {
            data: {
                map: {
                    dom: {
                        isgin: true
                    }
                },
                arg: 13
            },
            name: "小貓貓"
        },
        bool: [1,2,3,4]
    };
    observe(obj);
    obj.bool.push(7);
    document.getElementById("text").innerHTML = obj.data.name;
}
export default output

運行結果如下

在這里插入圖片描述

很明顯 我們數(shù)組并捕獲不到 push方法 除了 push 很多數(shù)組方法都捕獲不到

首先 我們來看幾個方法 分別是

在這里插入圖片描述

這幾個方法執(zhí)行 說明 當前數(shù)組被改寫了內容

那么 我們可以去改寫這七個方法 我們在案例 src目錄下創(chuàng)建 Arrays.js 然后 大家先要知道 這些方法被定義在哪里? Array.prototype Array是數(shù)組類型的一個類對象 這些方法就定義在Array的原型鏈上 所以 大家才能通過 數(shù)組.這些方法 去調用他們 而我們要做的就是 重寫這些方法 要做的就是 調用原來的方法 然后 在后面再去做自己需要做的響應式的事情

我們先在src下創(chuàng)建一個def.js 然后將之前寫在dataResp.js中的def放進def.js來

export const def = function(obj,key,value,enumerable) {
    Object.defineProperty(obj,key,{
        value,
        enumerable,
        //true  設為可寫
        writable: true,
        //true  設為可被刪除
        configurable: true
    });
}

然后 將dataResp.js中的def方法干掉 然后 dataResp.js引入一下def.js的 def方法

import {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> def } from './def.js';

這個是我之前沒想清楚 抱歉

然后 我們在Arrays.js中編寫代碼如下

import { def } from './def.js';
const arrayPrototype = Array.prototype;
export const arrayMethods = Object.create(arrayPrototype);
const redefineArrayMethod = [
    'push',
    'pop',
    'shift',
    'unshift',
    'splice',
    'sort',
    'reverse'
]
redefineArrayMethod.forEach(item =>{
    const backupFunction = arrayPrototype[item];
    def(arrayMethods,item,function(){
        backupFunction.apply(this, arguments);
        console.log('數(shù)組執(zhí)行了',item,'操作,值被修改為',this);
    },false);
})

這里 我們先定義了redefineArrayMethod變量 他的值是一個數(shù)組 對應下面每一個字符串下標 都是這些改變數(shù)組結構的函數(shù)關鍵字

然后定義 arrayPrototype 存一下Array的 原型鏈 prototype 因為 這些函數(shù)就在上面

然后 創(chuàng)建arrayMethods 記錄創(chuàng)建數(shù)組 并將arrayPrototype

最后 循環(huán)redefineArrayMethod 對應每一次下標循環(huán) 拿到都是一個數(shù)組方法關鍵字 第一次拿到’push’ 第二次’pop’

然后 我們的響應式代碼就可以寫在這里 首先 我們先

const backupFunction = arrayPrototype[item];

備份一下原來的方法 因為 你別重寫之后 方法原有的邏輯沒有了啊 是不是

你別說 push我監(jiān)聽一下 寫完 push都加不進去東西了 那響應個啥 這BUG了啊

然后 我們調用def

第一個參數(shù)是 arrayMethods 就是被創(chuàng)建的對象

第二個 這里傳的是 當前循環(huán)的內容 就是方法名數(shù)組下標 看著是第幾次循環(huán) 第一次 push 第二次 pop 第三次 shift 依次類推

第四個參數(shù) 不用說 這東西你們肯定不希望他參與遍歷吧 果斷false 至于第三個 是他的值 我們要改寫這個函數(shù)啊 就寫了這個函數(shù)新的內容

backupFunction.apply(this, arguments);

先把我們備份的之前的函數(shù)內容執(zhí)行了 就是 比如 push 我們先用執(zhí)行參數(shù)幫他把push應該有的增加下標的邏輯執(zhí)行了 this不用說 肯定要的 當前對象 然后arguments代表我們當前函數(shù)拿到的所有參數(shù) 全部給了backupFunction.apply當參數(shù) 就是保證參數(shù)不要少了

然后下面的代碼 我們就捕獲被改變的這個事情

然后 我們改寫 dataResp.js中的Observer類代碼如下

class Observer{
    constructor(value) {
        //相當于  給拿到的對象  其中的__ob__綁定 值為thsi,在類中用this 表示取實例本身給__ob__賦值  最后一個enumerable為false 表示屬性不參與for遍歷
        def(value,'__ob__',this,false);
        if(Array.isArray(value)){
            Object.setPrototypeOf(value, arrayMethods);
        }
        this.walk(value);
    }
    walk(value) {
        for(let key in value){
            defineReactive(value,key);
        }
    }
}

就是 監(jiān)聽到 如果是數(shù)字類型 調用一下 Object.setPrototypeOf 監(jiān)聽

然后 我們再次運行代碼

在這里插入圖片描述

可以看到 我們重寫的方法 就起效了 push被成功捕獲 并輸出了語句

在這里插入圖片描述

到此這篇關于vue數(shù)據(jù)響應式原理重寫函數(shù)實現(xiàn)數(shù)組響應式監(jiān)聽的文章就介紹到這了,更多相關vue重寫函數(shù)實現(xiàn)數(shù)組響應式監(jiān)聽內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • springboot?@Async?注解如何實現(xiàn)方法異步

    springboot?@Async?注解如何實現(xiàn)方法異步

    這篇文章主要介紹了springboot?@Async?注解如何實現(xiàn)方法異步,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 使用SpringMVC響應json格式返回的結果類型

    使用SpringMVC響應json格式返回的結果類型

    這篇文章主要介紹了使用SpringMVC響應json格式返回的結果類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java并發(fā)編程之LongAdder執(zhí)行情況解析

    Java并發(fā)編程之LongAdder執(zhí)行情況解析

    這篇文章主要為大家介紹了Java并發(fā)編程之LongAdder執(zhí)行情況解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Java畢業(yè)設計實戰(zhàn)之養(yǎng)老院管理系統(tǒng)的實現(xiàn)

    Java畢業(yè)設計實戰(zhàn)之養(yǎng)老院管理系統(tǒng)的實現(xiàn)

    讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+JSP+Easyui+maven+mysql實現(xiàn)一個養(yǎng)老院管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2022-03-03
  • Spring Boot與Kotlin定時任務的示例(Scheduling Tasks)

    Spring Boot與Kotlin定時任務的示例(Scheduling Tasks)

    這篇文章主要介紹了Spring Boot與Kotlin定時任務的示例(Scheduling Tasks),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Java非遞歸實現(xiàn)刪除任意目錄的方法

    Java非遞歸實現(xiàn)刪除任意目錄的方法

    這篇文章主要為大家詳細介紹了Java非遞歸實現(xiàn)刪除任意目錄的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java 的可變參數(shù)方法詳述

    Java 的可變參數(shù)方法詳述

    這篇文章主要介紹了Java 的可變參數(shù)方法,可變參數(shù)只能作為函數(shù)的最后一個參數(shù),在其前面可以有也可以沒有任何其他參數(shù),由于可變參數(shù)必須是最后一個參數(shù),所以一個函數(shù)最多只能有一個可變參數(shù),下面我們一起進入文章了解更多關于可變參數(shù)的內容吧
    2022-02-02
  • mybatis動態(tài)sql之新增與更新方式

    mybatis動態(tài)sql之新增與更新方式

    這篇文章主要介紹了mybatis動態(tài)sql之新增與更新方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot底層注解超詳細介紹

    SpringBoot底層注解超詳細介紹

    這篇文章主要介紹了SpringBoot底層注解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-09-09
  • spring-redis-session 自定義 key 和過期時間

    spring-redis-session 自定義 key 和過期時間

    這篇文章主要介紹了spring-redis-session 自定義 key 和過期時間,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12

最新評論