學會處理項目中,Cannot read properties of undefined (reading '****')


今天項目中報錯TypeError: Cannot read properties of undefined (reading 'filter'),開始報錯沒影響到運行就沒管。后面頁面中其他功能(清空購物車)購物車模塊崩潰了。 

直接翻到最下面看2022.3.4和2022.4.22總結。

 

2022.2.9

// 利用filter過濾在利用reduce累加
  return this.cartList.cartInfoList.filter((element,index,arr)=>element.isChecked ===1).reduce((prev,cur,arr)=>(prev + cur.skuPrice*cur.skuNum),0)

在cartList.cartInfoList(購物車)清空后,打印cartList.cartInfoList返回undefined,故需先返回判斷cartList.cartInfoList是否存在 

// 判斷購物車列表清單是否清空(也可以判斷父元素this.cartList.length!==0)
if (this.cartList.cartInfoList) {
  // 利用filter過濾在利用reduce累加
  return this.cartList.cartInfoList.filter((element,index,arr)=>element.isChecked ===1).reduce((prev,cur,arr)=>(prev + cur.skuPrice*cur.skuNum),0)
}else{
  return 0
}

同理,在使用對象或數組的方法時,報錯提示TypeError: Cannot read properties of undefined (reading 'filter'),首先想到判斷目標對象或數組是否存在,如果需要可以進一步判斷是數組還是對象,判斷數組Array.isArray,判斷對象Object.prototype.toString。

思考:根據報錯,xxx.filter 中的xxx未定義,filter為數組方法,所以需要判斷數組是否存在才不會報錯。理論上加上一個空數組   || []  兜底應該也不會報錯了。

 


2022.2.12

今天又遇到類似問題,Cannot read properties of undefined (reading 'userAddress'),屬性userAddress的對象為undefined。注:上面為什么要這么寫,因為涉及到業務邏輯客戶手動刪除出現清空購物車的情況

只要加上||{}兜底,若為null或者undefined即初始化為空對象{},目的防止出現null或者undefined的錯誤。

思考:根據報錯,xxx.userAddress 中的xxx未定義,userAddress明顯是一個自定義屬性,所以xxx肯定為對象。所以加上一個空對象  ||{}  兜底就不會報錯了。

return arr.find(element=>element.isDefault==1)||{}    
//搞清楚||或運算符的定義,第一個條件為真,則不需要執行第二個條件,否則執行第二個條件

 

 

 

 

 

 

 

 


2022.3.4

再次遇到這種某個屬性(方法)未定義的問題頁面卻能正常顯示,思考可能是因為對象/數組渲染問題導致的,第一步應該判斷 (reading 'xxx')里的xxx是函數方法(對象or數組的方法)還是自定義屬性(肯定是對象),

 

這個問題本質是由於渲染早於異步請求數據返回的時間,其實只需要解決報錯undefined的初始化問題,你能理解這個以下方法就很好理解。

一、若報錯的undefinde的屬性為對象或者數組的api,

  1.解決方法是在對象/數組后面加上 ||[ ] 或者 ||{ } 兜底,這樣渲染的時候就不會報錯了

 

二、若報錯的undefined的屬性為自定義屬性,則可以使用以下幾種方法

  1.如果數據是在data里面定義的,最笨的方法,把相應數據結構在data寫出來(對應的值為空對象、數組) 

  2.父級套v-if,數據沒有返回時,節點直接不生成,數據返回,節點生成。(if判斷的開關就用報錯那個屬性)

  3.用&&或者if()判斷異步數據已返回,不會用if語句和&&邏輯與 計算布爾值作為開關標識符?點擊站內跳轉←

 

 

2022.4.22補充

你發ajax請求,數據還沒回來,卻開始渲染請求來的數據,肯定報undefined啊,為什么有時候又不影響你頁面展示?因為請求的數據經過等待肯定回來了,但是控制台上的undefined無法解決。

補充ES6 優雅的解決方法(本質上同3月4日的第三種方法)

 

如何秒用可選鏈操作符來解決  渲染早於異步請求數據 導致的控制台報錯,點擊站內跳轉←


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM