2024-11-02|閱讀時間 ‧ 約 0 分鐘

Vue 使用 reverse(), 打包後發生錯誤


在 Vue 中使用 .reverse() 來直接修改陣列並顯示資料時,在開發環境中運行沒有問題,但是在打包部署後,卻可能發生頁面卡住的問題。

問題點

.reverse() 是一個會就地修改陣列的操作,會直接改變原始的陣列順序。這在開發階段可能沒有問題,因為 Vue 的熱更新和開發伺服器可能會自動處理資料更新。但在打包後的生產環境中,這樣的改動可能會導致以下問題:

  1. 重新渲染的錯誤:Vue 依賴變動檢測系統來追蹤陣列或物件的改變。如果直接修改原始陣列,Vue 可能無法正確追蹤變化,導致渲染錯誤或當機。
  2. 不可預測的順序變化:由於 .reverse() 改變了原始資料的順序,後續的任何操作(例如數據重新加載或狀態變化)可能會基於這個已被更改的順序,導致狀態不一致。

解決方式

可以在不改變原始數據的情況下,使用 .slice() 創建一個原始陣列的淺拷貝,然後對這個淺拷貝進行反轉,這樣就不會影響原始數據,確保 Vue 能夠正常追蹤變更並在打包後的生產環境中穩定運行。

<div v-for="item in arr.slice().reverse()" :key="item.id">

<div>{{item.name}}</div>

</div>


即使在 Vue 的 <script> 中使用 .reverse() 操作陣列時,如果該操作改變的是 Vue 反應性系統中的數據(如 datacomputed 中的屬性),也仍然可能導致問題。這是因為 .reverse() 直接修改了原始陣列,而 Vue 反應性系統可能無法正確追蹤這種改變,特別是在進行打包或狀態變化時。


.reverse() 作用於 Vue 的反應性數據(如 datacomputed

  • 反應性數據中的 .reverse() 會修改原始資料,可能影響其他依賴該數據的計算屬性、監聽器或其他使用者介面更新。
  • 這樣的變更容易導致 Vue 的更新行為變得不可預測,因為 Vue 無法確保變更是否會被所有相關的依賴更新。


.reverse() 用於一個非反應性的陣列

  • 如果該陣列不是由 Vue 反應性系統管理(如本地變量或非反應性數據),則 .reverse() 不會有上述的影響,因為 Vue 不需要追蹤這些變更。


解決方式

同樣可以使用 .slice() ,先將原始陣列複製成新陣列後再進行反轉。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.