在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    記一次 vue3 數(shù)組不響應(yīng)問(wèn)題的排查,對(duì)象也有可能不響應(yīng)

    最近在編程時(shí),遇到了 vue3 數(shù)組更新卻沒(méi)有響應(yīng)的問(wèn)題,解決后,決定把對(duì)這次的問(wèn)題總結(jié)記錄下來(lái)。

    代碼重現(xiàn)

    項(xiàng)目的代碼太復(fù)雜了,我做了一個(gè)超精簡(jiǎn)版本的重現(xiàn)代碼:

    {{ data.list }}

    添加

    item-service 代碼:

    // 條目列表緩存對(duì)象let _items: string[] | undefined = undefinedtype Listener = (items: string[]) => voidconst listeners: Array = []export async function getItems(): Promise { if (_items) { return _items } // 從服務(wù)器請(qǐng)求數(shù)據(jù) _items = await doAjax() return _items}export async function addItem(item: string) { const items = await getItems() items.push(item) listeners.forEach(listener => listener(items))}export async function onItemsChange(listener: Listener) { listeners.push(listener)}

    item-service 中緩存了列表對(duì)象,然后組件中一直使用 item-service 中緩存的這個(gè)列表給 data 賦值 ,問(wèn)題就出在這。

    程序調(diào)試

    vue3 的響應(yīng)式是通過(guò) Proxy 實(shí)現(xiàn)的,我在 onItemsChange 回調(diào)時(shí)做了調(diào)試,下面是 Proxy handler 的 set 方法的調(diào)試過(guò)程。為了方便查看,調(diào)試中沒(méi)有被執(zhí)行到的代碼都注釋掉了,并且加了一些說(shuō)明。

    // 注釋掉的代碼都是調(diào)試過(guò)程中沒(méi)有被執(zhí)行的代碼function set(target, key, value, receiver) { // 代理 handler 的 set 方法參數(shù)說(shuō)明: // target 原始對(duì)象,getItems() 返回的 list // key 屬性名稱,‘list’ // value 要設(shè)置的值,onItemsChange 回調(diào)的 list 對(duì)象 // receiver 最初被調(diào)用的對(duì)象,通常是 proxy 本身,這里就是 data.list, list的代理對(duì)象 let oldValue = target[key]; // 使用 shallowReactive 的情況下 shallow 標(biāo)記是 true ,這里是 false if (!shallow && !isReadonly(value)) { value = toRaw(value); oldValue = toRaw(oldValue); // export const isArray = Array.isArray // !isArray(target) 返回 false if (!isArray(target) && isRef(oldValue) && !isRef(value)) { // oldValue.value = value; // return true; } } const hadKey = isArray(target) && isIntegerKey(key) // isIntegerKey(key) 返回 false,下行不執(zhí)行 // ? Number(key) !Object.is(value, oldValue) // value 和 oldValue 是同一個(gè) list 數(shù)組對(duì)象, hasChanged 返回 false // trigger(target, “set” /* SET */, key, value, oldValue); } } return result;}

    可以看到?jīng)]有觸發(fā)任何更新,因此沒(méi)有響應(yīng)。

    原因總結(jié)

    原因總算確定了,其實(shí)就是因?yàn)楸淮淼臄?shù)組,和要賦值的數(shù)組是同一個(gè)數(shù)據(jù),在 Proxy 的回調(diào)中判定值沒(méi)有改變,沒(méi)有觸發(fā)更新。

    // data.list 是 list 的代理對(duì)象,將 data.list 提取原始值(toRaw)就是 listdata.list = list

    處理的方法也比較簡(jiǎn)單,將數(shù)組簡(jiǎn)單的克隆下,就沒(méi)有問(wèn)題了。

    getItems().then((res) => data.list = […res]).catch(console.error)onItemsChange((list) => data.list = […list])

    還可以將 item-service 中返回的列表直接克隆。

    我這種情況是由于緩存數(shù)據(jù)共享對(duì)象引起的,對(duì)于需要共享數(shù)據(jù)的項(xiàng)目,還可以使用狀態(tài)管理組件,vuex 或 pinia。

    對(duì)象是否也有同樣問(wèn)題?

    既然是因?yàn)閺?fù)用數(shù)組,代理回調(diào)因?yàn)橹禌](méi)有改變最終沒(méi)有觸發(fā)更新,那么對(duì)象是否也存在這樣的問(wèn)題呢,我寫了個(gè)簡(jiǎn)單的代碼驗(yàn)證了下:

    {{ data.user }}

    change age

    答案是肯定的,問(wèn)題仍然存在。如果存在這種情況,可以將對(duì)象克隆(使用 Object.assign() 或其它的方法)得到一個(gè)新的對(duì)象,再給響應(yīng)式數(shù)據(jù)賦值來(lái)解決。

    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
    用戶投稿
    上一篇 2022年6月14日 06:30
    下一篇 2022年6月14日 09:07

    相關(guān)推薦

    • 分享4條發(fā)微商朋友圈的方法(微商朋友圈應(yīng)該怎么發(fā))

      對(duì)于微商朋友來(lái)說(shuō),朋友圈的重要性不言而喻了。 那么微商的朋友圈到底該怎么發(fā)呢? 為什么同樣是經(jīng)營(yíng)一個(gè)朋友圈,有的微商看起來(lái)逼格滿滿,實(shí)際效果也不錯(cuò);而有的卻動(dòng)都不動(dòng)就被屏蔽甚至拉黑…

      2022年11月27日
    • 存儲(chǔ)過(guò)程語(yǔ)法(sql server存儲(chǔ)過(guò)程語(yǔ)法)

      今天小編給各位分享存儲(chǔ)過(guò)程語(yǔ)法的知識(shí),其中也會(huì)對(duì)sql server存儲(chǔ)過(guò)程語(yǔ)法進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧! oracle存儲(chǔ)過(guò)程基本語(yǔ)法…

      2022年11月26日
    • 《寶可夢(mèng)朱紫》夢(mèng)特性怎么獲得?隱藏特性獲取方法推薦

      寶可夢(mèng)朱紫里有很多寶可夢(mèng)都是擁有夢(mèng)特性會(huì)變強(qiáng)的寶可夢(mèng),很多玩家不知道夢(mèng)特性怎么獲得,下面就給大家?guī)?lái)寶可夢(mèng)朱紫隱藏特性獲取方法推薦,感興趣的小伙伴一起來(lái)看看吧,希望能幫助到大家。 …

      2022年11月25日
    • 《寶可夢(mèng)朱紫》奇魯莉安怎么進(jìn)化?奇魯莉安進(jìn)化方法分享

      寶可夢(mèng)朱紫中的奇魯莉安要怎么進(jìn)化呢?很多玩家都不知道,下面就給大家?guī)?lái)寶可夢(mèng)朱紫奇魯莉安進(jìn)化方法分享,感興趣的小伙伴一起來(lái)看看吧,希望能幫助到大家。 奇魯莉安進(jìn)化方法分享 奇魯莉安…

      2022年11月25日
    • 什么是推廣cpa一篇文章帶你看懂CPA推廣渠道

      CPA渠道 CPA指的是按照指定的行為結(jié)算,可以是搜索,可以是注冊(cè),可以是激活,可以是搜索下載激活,可以是綁卡,實(shí)名認(rèn)證,可以是付費(fèi),可以是瀏覽等等。甲乙雙方可以根據(jù)自己的情況來(lái)定…

      2022年11月25日
    • 抖音直播帶貨有哪些方法技巧(抖音直播帶貨有哪些痛點(diǎn))

      如今抖音這個(gè)短視頻的變現(xiàn)能力越來(lái)越突顯了,尤其是在平臺(tái)上開(kāi)通直播,更具有超強(qiáng)的帶貨屬性,已經(jīng)有越來(lái)越多的普通人加入到其中了。不過(guò)直播帶貨雖然很火,但是也不是每個(gè)人都能做好的,那么在…

      2022年11月24日
    • 明查|美國(guó)新冠后遺癥患者中有16%癥狀嚴(yán)重以致無(wú)法工作?

      點(diǎn)擊進(jìn)入澎湃新聞全球事實(shí)核查平臺(tái) 速覽 – 網(wǎng)傳數(shù)據(jù)比例無(wú)權(quán)威信源佐證,該比例有可能是結(jié)合了美國(guó)疾病防控中心和布魯金斯學(xué)會(huì)的數(shù)據(jù)得出,但這兩個(gè)機(jī)構(gòu)的調(diào)研目的和樣本都不同…

      2022年11月24日
    • 《寶可夢(mèng)朱紫》暴飛龍?jiān)趺醋ィ勘╋w龍獲得方法

      寶可夢(mèng)朱紫暴飛龍位置在哪?在游戲中,很多玩家還不清楚暴飛龍具體要怎么樣獲得,其實(shí)獲得方法很簡(jiǎn)單,暴飛龍直接是沒(méi)得抓的,需要玩家從寶貝龍進(jìn)化得到,下面一起來(lái)看一下寶可夢(mèng)朱紫暴飛龍獲得…

      2022年11月23日
    • 《寶可夢(mèng)朱紫》布土撥怎么進(jìn)化?布土撥進(jìn)化方法介紹

      寶可夢(mèng)朱紫中,不同的寶可夢(mèng)有不同的進(jìn)化方法,其中布土撥的進(jìn)化方法是比較特殊的。很多玩家不知道寶可夢(mèng)朱紫布土撥怎么進(jìn)化,下面就帶來(lái)寶可夢(mèng)朱紫布土撥進(jìn)化方法介紹,一起來(lái)看看吧,希望能幫…

      2022年11月23日
    • 《寶可夢(mèng)朱紫》薄荷怎么獲得?薄荷獲得方法

      寶可夢(mèng)朱紫中薄荷有改變寶可夢(mèng)的屬性或性格等效果,很多玩家想知道寶可夢(mèng)朱紫薄荷怎么獲得,下面就帶來(lái)寶可夢(mèng)朱紫薄荷獲得方法,感興趣的小伙伴一起來(lái)看看吧,希望能幫助到大家。 薄荷獲得方法…

      2022年11月23日

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息