亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue響應式Object代理對象的修改和刪除屬性是什么

發布時間:2022-08-04 11:29:00 來源:億速云 閱讀:190 作者:iii 欄目:開發技術

這篇“vue響應式Object代理對象的修改和刪除屬性是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“vue響應式Object代理對象的修改和刪除屬性是什么”文章吧。

set

set就是修改代理的屬性,按照我們之前寫的reactive,它大概是這樣的

const ITERATE_KEY=symbol()
const p = new Proxy(obj,{
 set(target,key,newVal,receiver){
        const res = Reflect.set(target,key,newVal,receiver)
        trigger(target,key)
        return res
  }
}

細心的朋友應該發現了,我專門把ITERATE_KEY也加進來了,但是在set中并沒有使用,難道是多余的?

這里其實有一個小坑,就是如果曾經對對象使用過for ... in,這里會出現2種情況:

  • 如果我們新增了一個屬性,那么我們是不是應該重新運行一次for ... in的副作用函數。

  • 如果我們只是修改某個屬性而不是新增,那么我們就不應該重新運行for ... in的副作用函數. 所以我們需要判斷一下它是新增還是修改

//定義常量,在ts中可以使用枚舉
const TriggerType = {
    SET:'SET',
    ADD:'ADD'
}
const p = new Proxy(obj,{
 set(target,key,newVal,receiver){
         //判斷新增還是修改
         const type = Object.prototype.hasOwnProperty.call(target,key) 
         ? TriggerType.SET
         : TriggerType.ADD
        const res = Reflect.set(target,key,newVal,receiver)
        trigger(target,key,type)
        return res
  }
}

同時,對應trigger函數中,我們也需要根據type讀取ITERATE_KEY對應的副作用函數.

const trigger = (target,key,type)=>{
    const depsMap = targetMap.get(target)
    if(!depsMap){
        return 
    }
    const effects = depsMap.get(key)
    // 再次去重
    const needToRun = new Set()
    if(effects){
        effects.forEach(e=> e!==activeEffect
            ? needToRun.add(e)
            : ''
        )
    }
    if(type === TriggerType.ADD){
        const otherEffects = depsMap.get(ITERATE_KEY)
        if(otherEffects){
            otherEffects.forEach(e=> e!==activeEffect
                ? needToRun.add(e)
                : ''
            )
        }
    }
    if(needToRun.length){
        needToRun.forEach(fn=> fn?.options?.scheduler ? fn.options.scheduler(fn) : fun())
    }
}

這樣,我們只在新增的時候才會調用for ... in的副作用函數。

delete

刪除的時候,之前貌似沒寫過。這里需要注意2個點。

  • 保證屬性刪除之后才運行副作用,這里從邏輯上講我們最好先驗證這個屬性是否存在,避免報錯。

  • 刪除時也要運行for ... in的副作用函數

因此我們這樣定義,給TriggerType新增一個類型DEL

const TriggerType = {
    SET:'SET',
    ADD:'ADD',
    DEL:'DELETE'
}

然后,我們開始攔截刪除屬性的操作,查一下之前的Proxy內部方法的表,我們可以得知,刪除屬性對應著deleteProperty方法。

const p = new Proxy(obj,{
 deleteProperty(target,key){
         //判斷屬性存在,你總不能刪除一個不存在的屬性吧
        const hadKey = Object.prototype.hasOwnProperty.call(target,key)  
        const res = Reflect.deleteProperty(target,key)
        if(res && hadKey){
            trigger(target,key,TriggerType.DEL)
        }
        return res
  }
}

對應trigger函數中,我們小修改一下,其他邏輯不變

// 刪除這句
- if(type === TriggerType.ADD){
// 改為
+ if([TriggerType.ADD,TriggerType.DEL].includes(type)){

這樣就可以實現響應式對象的刪除屬性。

其實原文中并沒有使用Array.includes,但我覺得其實我們應該使用最新的語法,現在瀏覽器環境對這些新語法支持度已經很好了(如果你要兼容IE當我沒說)。

以上就是關于“vue響應式Object代理對象的修改和刪除屬性是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武宁县| 白山市| 大关县| 都安| 柘荣县| 景洪市| 江永县| 垦利县| 成安县| 华阴市| 定边县| 南乐县| 台山市| 施秉县| 铜梁县| 黄石市| 阿图什市| 汉川市| 安溪县| 霍邱县| 清新县| 麻城市| 镇平县| 阿鲁科尔沁旗| 南通市| 郓城县| 三台县| 余姚市| 华池县| 洛川县| 阜宁县| 仪陇县| 北京市| 兴宁市| 涞水县| 栾川县| 辽源市| 乐陵市| 田林县| 麦盖提县| 富阳市|