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

Vue.js中輕松解決v-for執(zhí)行出錯(cuò)的三個(gè)方案

 更新時(shí)間:2017年06月09日 09:04:51   作者:王玉豹  
v-for標(biāo)簽可以用來遍歷數(shù)組,將數(shù)組的每一個(gè)值綁定到相應(yīng)的視圖元素中去,下面這篇文章主要給大家介紹了關(guān)于在Vue.js中輕松解決v-for執(zhí)行出錯(cuò)的三個(gè)方案,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。

前言

Vue.js 是開源的一個(gè)前端開發(fā)庫,通過簡潔的 API 提供高效的數(shù)據(jù)綁定和靈活的組件系統(tǒng)。在前端紛繁復(fù)雜的生態(tài)中,Vue.js在近年來受到一定程度的關(guān)注,目前在 GitHub上已經(jīng)有5000+。

本文是筆者在開發(fā)實(shí)踐中踩過的坑,總結(jié)和分享出來,希望對大家學(xué)習(xí)Vue有所幫助。下面來看看詳細(xì)的介紹:

【問題描述】

v-for遍歷數(shù)組中存在空值導(dǎo)致頁面報(bào)錯(cuò),情況如下:

開發(fā)框架是以Vue為模型綁定的核心,根據(jù)錯(cuò)誤可以進(jìn)行一個(gè)簡單的判斷:

      ▪ removeChild操作既然不是發(fā)生在開發(fā)者顯示書寫的代碼中,就應(yīng)該是模型銷毀后Vue引擎移除dom節(jié)點(diǎn)導(dǎo)致的。

      ▪ 錯(cuò)誤棧信息都在框架的代碼之內(nèi),此操作不可能是有用戶代碼觸發(fā)導(dǎo)致的。

開發(fā)者某一流程的操作,會(huì)100%穩(wěn)定地觸發(fā)出這一錯(cuò)誤,此錯(cuò)誤導(dǎo)致js執(zhí)行終端,整個(gè)程序陷入癱瘓無法工作,開發(fā)者的操作流程可以簡化為如下的步驟:

      1. 訪問視圖A。

      2. 訪問視圖B。

      3. 回退歷史記錄到A。(錯(cuò)誤發(fā)生在這里)

以上的跳轉(zhuǎn)關(guān)系都是視圖跳轉(zhuǎn),也就是發(fā)生在路由系統(tǒng)之內(nèi)的路由跳轉(zhuǎn),按照路由邏輯,第三步的時(shí)候會(huì)依次執(zhí)行視圖的聲明周期函數(shù),包括:

      ▪ B視圖的unRender邏輯,包括beforeUnRender和afterUnRender。

      ▪ A視圖的Render,包括beforeRender和afterRender。

開發(fā)者只在beforeRender的階段進(jìn)行了模型重置的操作,幾乎可以確定無疑,報(bào)錯(cuò)就是由這幾行模型重置和賦值的操作引起的。層層排除可以尋找到使用簡單代碼重新此問題的方式。

【重現(xiàn)方式】

準(zhǔn)備一個(gè)簡單的空工程,新建視圖test,一下的代碼分別為js/view/test.js和html/view/test.html,js/view/test.js中視圖對模型的操作可以完整反映重現(xiàn)此問題的流程。其中,setTimeout模擬的是ajax操作以讓數(shù)據(jù)在多個(gè)tick之后設(shè)置到模型以觀察Vue對dom節(jié)點(diǎn)的創(chuàng)建和銷毀。

$nextTick之后,將test_arr置空的操作是為了使vue將此數(shù)據(jù)對應(yīng)的dom節(jié)點(diǎn)銷毀,對應(yīng)代碼如下:

以上的代碼可以穩(wěn)定重新問題,下面是解題思路。

【解決方案】

在不求甚解的狀態(tài)下,這個(gè)問題是比較容易解決的,這里有幾個(gè)臨時(shí)的解決方案。

▲方案一

從報(bào)錯(cuò)信息Uncaught TypeError: Cannot read property 'removeChild' of null可知,之所以發(fā)生這個(gè)問題是因?yàn)樵趎ull的對象上執(zhí)行了removeChild。

修改Vue框架代碼,將這里的代碼:

修改為:


▲方案二

深入地分析,為什么el.parentNode會(huì)是null,通過上面重現(xiàn)的步驟發(fā)現(xiàn),當(dāng)that.model.test_arr = ["","4","","5","6",""]這段代碼設(shè)置發(fā)生后,v-for產(chǎn)生的dom節(jié)點(diǎn)之后3個(gè),而不是5個(gè),這種情況下el.parentNode就是不存在的,所以產(chǎn)生了第二種解決方案,強(qiáng)制不給空數(shù)據(jù)的元素生成dom節(jié)點(diǎn)。


▲方案三

問題并不算是圓滿解決,正常的情況下框架應(yīng)該具有魯棒性,適應(yīng)不同的使用場景,不應(yīng)該出現(xiàn)js報(bào)錯(cuò)的問題,所以還有深入研究下去的必要。

在Vue中針對v-for指令有一個(gè)track-by的可選配置:

       ▪無track-by情況:數(shù)據(jù)修改時(shí),無論值是否被修改,dom都被重新渲染。

       ▪有track-by情況:數(shù)據(jù)修改時(shí),不變數(shù)據(jù)所在的dom不被重新渲染,已改變的數(shù)據(jù)所在dom才被重新渲染。

因?yàn)?v-for 默認(rèn)通過數(shù)據(jù)對象的特征來決定對已有作用域和 DOM 元素的復(fù)用程度,這可能導(dǎo)致重新渲染整個(gè)列表。但是,如果每個(gè)對象都有一個(gè)唯一 ID 的屬性,便可以使用 track-by 特性給 Vue 一個(gè)提示,Vue因而能盡可能地復(fù)用已有實(shí)例。所以就有了第三種解決方案。


【原因分析】

v-for遍歷數(shù)組中存在空值導(dǎo)致頁面報(bào)錯(cuò),主要是遍歷條件里對值的判斷有問題。Vue為了保證對dom節(jié)點(diǎn)的復(fù)用,內(nèi)置了一份按照id存取的dom緩存,通過對數(shù)據(jù)分析出dom_id,然后根據(jù)此id從緩存中獲取dom節(jié)點(diǎn)。由于不同的數(shù)據(jù)取到了相同的dom_id,所以沒有創(chuàng)建dom節(jié)點(diǎn)出來。但是,在最終數(shù)組置空,模型變更之后dom節(jié)點(diǎn)移除的時(shí)候卻為這些dom節(jié)點(diǎn)觸發(fā)了remove操作,也就是方案一中兼容的那些代碼:


所以問題必定出現(xiàn)在getTrackByKey這個(gè)函數(shù)的執(zhí)行上,以下是getTrackByKey的代碼:


Vue中對數(shù)據(jù)綁定的操作大大地提高了開發(fā)者應(yīng)用開發(fā)的效率,但與此同時(shí)也伴隨著一些不易察覺的問題,尤其如本文中問題的重現(xiàn)條件比較復(fù)雜的情況下,測試不一定可以覆蓋到問題的觸發(fā)條件,這個(gè)時(shí)候就需要開發(fā)人員多一分警惕。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 使用Element+vue實(shí)現(xiàn)開始與結(jié)束時(shí)間限制

    使用Element+vue實(shí)現(xiàn)開始與結(jié)束時(shí)間限制

    這篇文章主要為大家詳細(xì)介紹了使用Element+vue實(shí)現(xiàn)開始與結(jié)束時(shí)間限制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • vue前端和Django后端如何查詢一定時(shí)間段內(nèi)的數(shù)據(jù)

    vue前端和Django后端如何查詢一定時(shí)間段內(nèi)的數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于vue前端和Django后端如何查詢一定時(shí)間段內(nèi)的數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • vue3+ts數(shù)組去重方及reactive/ref響應(yīng)式顯示流程分析

    vue3+ts數(shù)組去重方及reactive/ref響應(yīng)式顯示流程分析

    這篇文章主要介紹了vue3+ts數(shù)組去重方法-reactive/ref響應(yīng)式顯示,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Element實(shí)現(xiàn)復(fù)雜table表格結(jié)構(gòu)的項(xiàng)目實(shí)踐

    Element實(shí)現(xiàn)復(fù)雜table表格結(jié)構(gòu)的項(xiàng)目實(shí)踐

    本文主要介紹了Element實(shí)現(xiàn)復(fù)雜table表格結(jié)構(gòu)的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • vue-cli 自定義指令directive 添加驗(yàn)證滑塊示例

    vue-cli 自定義指令directive 添加驗(yàn)證滑塊示例

    本篇文章主要介紹了vue-cli 自定義指令directive 添加驗(yàn)證滑塊示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Vue項(xiàng)目打包部署的實(shí)戰(zhàn)過程記錄

    Vue項(xiàng)目打包部署的實(shí)戰(zhàn)過程記錄

    我們使用nginx部署Vue項(xiàng)目,實(shí)質(zhì)上就是將Vue項(xiàng)目打包后的內(nèi)容同步到nginx指向的文件夾,下面這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目打包部署的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • vue實(shí)現(xiàn)錨點(diǎn)跳轉(zhuǎn)scrollIntoView()使用案例

    vue實(shí)現(xiàn)錨點(diǎn)跳轉(zhuǎn)scrollIntoView()使用案例

    這篇文章主要介紹了vue實(shí)現(xiàn)錨點(diǎn)跳轉(zhuǎn)scrollIntoView()使用案例,文中結(jié)合實(shí)例代碼介紹了vue錨點(diǎn)跳轉(zhuǎn)的三種方式(頁內(nèi)跳轉(zhuǎn),跨頁跳轉(zhuǎn),函數(shù)跳轉(zhuǎn)),需要的朋友可以參考下
    2023-07-07
  • Vue3 computed初始化獲取設(shè)置值實(shí)現(xiàn)示例

    Vue3 computed初始化獲取設(shè)置值實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了Vue3 computed初始化以及獲取值設(shè)置值實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • vue3.x?的shallowReactive?與?shallowRef?使用場景分析

    vue3.x?的shallowReactive?與?shallowRef?使用場景分析

    在Vue3.x中,`shallowReactive`和`shallowRef`是用于創(chuàng)建淺層響應(yīng)式數(shù)據(jù)的API,它們與`reactive`和`ref`類似,本文介紹vue3.x??shallowReactive?與?shallowRef的使用場景,感興趣的朋友一起看看吧
    2025-02-02
  • Vue.js實(shí)現(xiàn)watch屬性的示例詳解

    Vue.js實(shí)現(xiàn)watch屬性的示例詳解

    本文討論了watch函數(shù)是如何利用副作用函數(shù)和options進(jìn)行封裝實(shí)現(xiàn)的,也通過調(diào)度函數(shù)去控制回調(diào)函數(shù)的立即執(zhí)行和執(zhí)行時(shí)機(jī),還可以解決競態(tài)問題,感興趣的可以了解一下
    2022-04-04

最新評(píng)論

视频| 公安县| 迁西县| 罗城| 龙江县| 六安市| 阳泉市| 双城市| 连州市| 个旧市| 西吉县| 邢台市| 吉木萨尔县| 双峰县| 无棣县| 宣汉县| 区。| 沅陵县| 长葛市| 麻城市| 正阳县| 新余市| 沁源县| 类乌齐县| 合江县| 岳池县| 四川省| 福州市| 宣武区| 靖边县| 宝丰县| 天镇县| 怀集县| 木里| 伊川县| 佛坪县| 吉安县| 彭阳县| 丹阳市| 邛崃市| 娄烦县|