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

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

 更新時(shí)間:2023年05月16日 11:12:27   作者:-耿瑞-  
Vue的通過(guò)數(shù)據(jù)劫持的方式實(shí)現(xiàn)數(shù)據(jù)的雙向綁定,即使用Object.defineProperty()來(lái)實(shí)現(xiàn)對(duì)屬性的劫持,但是Object.defineProperty()中的setter是無(wú)法直接實(shí)現(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

運(yùn)行結(jié)果如下

在這里插入圖片描述

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

首先 我們來(lái)看幾個(gè)方法 分別是

在這里插入圖片描述

這幾個(gè)方法執(zhí)行 說(shuō)明 當(dāng)前數(shù)組被改寫了內(nèi)容

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

我們先在src下創(chuàng)建一個(gè)def.js 然后將之前寫在dataResp.js中的def放進(jìn)def.js來(lái)

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

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

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

這個(gè)是我之前沒(méi)想清楚 抱歉

然后 我們?cè)贏rrays.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變量 他的值是一個(gè)數(shù)組 對(duì)應(yīng)下面每一個(gè)字符串下標(biāo) 都是這些改變數(shù)組結(jié)構(gòu)的函數(shù)關(guān)鍵字

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

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

最后 循環(huán)redefineArrayMethod 對(duì)應(yīng)每一次下標(biāo)循環(huán) 拿到都是一個(gè)數(shù)組方法關(guān)鍵字 第一次拿到’push’ 第二次’pop’

然后 我們的響應(yīng)式代碼就可以寫在這里 首先 我們先

const backupFunction = arrayPrototype[item];

備份一下原來(lái)的方法 因?yàn)?你別重寫之后 方法原有的邏輯沒(méi)有了啊 是不是

你別說(shuō) push我監(jiān)聽(tīng)一下 寫完 push都加不進(jìn)去東西了 那響應(yīng)個(gè)啥 這BUG了啊

然后 我們調(diào)用def

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

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

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

backupFunction.apply(this, arguments);

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

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

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

class Observer{
    constructor(value) {
        //相當(dāng)于  給拿到的對(duì)象  其中的__ob__綁定 值為thsi,在類中用this 表示取實(shí)例本身給__ob__賦值  最后一個(gè)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)聽(tīng)到 如果是數(shù)字類型 調(diào)用一下 Object.setPrototypeOf 監(jiān)聽(tīng)

然后 我們?cè)俅芜\(yùn)行代碼

在這里插入圖片描述

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

在這里插入圖片描述

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

相關(guān)文章

  • 初識(shí)Spring Boot框架和快速入門

    初識(shí)Spring Boot框架和快速入門

    這篇文章主要介紹了初識(shí)Spring Boot框架學(xué)習(xí),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • mybatis-plus雪花算法生成Id使用詳解

    mybatis-plus雪花算法生成Id使用詳解

    本文主要介紹了mybatis-plus雪花算法生成Id使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Mybatis注解sql時(shí)出現(xiàn)的一個(gè)錯(cuò)誤及解決

    Mybatis注解sql時(shí)出現(xiàn)的一個(gè)錯(cuò)誤及解決

    這篇文章主要介紹了Mybatis注解sql時(shí)出現(xiàn)的一個(gè)錯(cuò)誤及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 計(jì)算機(jī)編程語(yǔ)言發(fā)展史

    計(jì)算機(jī)編程語(yǔ)言發(fā)展史

    這篇文章主要介紹了Java計(jì)算機(jī)編程語(yǔ)言發(fā)展史,編程語(yǔ)言?可以簡(jiǎn)單的理解為一種計(jì)算機(jī)和人都能識(shí)別的語(yǔ)言。一種計(jì)算機(jī)語(yǔ)言讓程序員能夠準(zhǔn)確地定義計(jì)算機(jī)所需要使用的數(shù)據(jù),并精確地定義在不同情況下所應(yīng)當(dāng)采取的行動(dòng),下面詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-01-01
  • SpringBoot初始化加載配置的八種方式總結(jié)

    SpringBoot初始化加載配置的八種方式總結(jié)

    在日常開(kāi)發(fā)時(shí),我們常常需要 在SpringBoot應(yīng)用啟動(dòng)時(shí)執(zhí)行某一段邏輯,如獲取一些當(dāng)前環(huán)境的配置或變量、向數(shù)據(jù)庫(kù)寫入一些初始數(shù)據(jù)或者連接某些第三方系統(tǒng),確認(rèn)對(duì)方可以工作,那么在實(shí)現(xiàn)初始化邏輯代碼時(shí)就需要小心了,所以本文介紹了SpringBoot初始化加載配置的方式
    2024-12-12
  • java自動(dòng)裝箱拆箱深入剖析

    java自動(dòng)裝箱拆箱深入剖析

    基本數(shù)據(jù)(Primitive)類型的自動(dòng)裝箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0開(kāi)始提供的功能。java語(yǔ)言規(guī)范中說(shuō)道:在許多情況下包裝與解包裝是由編譯器自行完成的(在這種情況下包裝成為裝箱,解包裝稱為拆箱)
    2012-11-11
  • Spring 異常單元測(cè)試的解決

    Spring 異常單元測(cè)試的解決

    這篇文章主要介紹了Spring 異常單元測(cè)試的解決,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Java基本類型包裝類概述與Integer類、Character類用法分析

    Java基本類型包裝類概述與Integer類、Character類用法分析

    這篇文章主要介紹了Java基本類型包裝類概述與Integer類、Character類用法,結(jié)合實(shí)例形式分析了java基本數(shù)據(jù)類型與字符串轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • 通過(guò)實(shí)例講解springboot整合WebSocket

    通過(guò)實(shí)例講解springboot整合WebSocket

    這篇文章主要介紹了通過(guò)實(shí)例講解springboot整合WebSocket,WebSocket為游覽器和服務(wù)器提供了雙工異步通信的功能,即游覽器可以向服務(wù)器發(fā)送消息,服務(wù)器也可以向游覽器發(fā)送消息。,需要的朋友可以參考下
    2019-06-06
  • JAVA基礎(chǔ)之一些不為人知的那些秘密

    JAVA基礎(chǔ)之一些不為人知的那些秘密

    一個(gè) Java 程序可以認(rèn)為是一系列對(duì)象的集合,而這些對(duì)象通過(guò)調(diào)用彼此的方法來(lái)協(xié)同工作,下面這篇文章主要給大家介紹了JAVA基礎(chǔ)之一些不為人知的那些秘密,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01

最新評(píng)論

申扎县| 东台市| 河间市| 绿春县| 出国| 宜宾县| 丰原市| 金华市| 临清市| 会理县| 拉孜县| 疏勒县| 九江县| 吴江市| 万安县| 伊吾县| 中西区| 鸡泽县| 贵阳市| 民县| 绥德县| 遂宁市| 乐业县| 年辖:市辖区| 元谋县| 长治县| 集安市| 水富县| 和平县| 河西区| 九龙县| 青龙| 桐乡市| 都昌县| 阿坝县| 大田县| 宜阳县| 策勒县| 舞阳县| 柞水县| 孟村|