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

更新於 發佈於 閱讀時間約 3 分鐘


在 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() ,先將原始陣列複製成新陣列後再進行反轉。

留言
avatar-img
留言分享你的想法!
avatar-img
Ni 1968的沙龍
2會員
12內容數
愛看金庸的阿傑,想來分享一下我看金庸的點點滴滴。 講談金庸小說,免不了要爆一堆雷,所以請尚未看過金庸小說的朋友,跳過這裡,先去看金庸原著,享受金庸的武俠世界,別被爆雷破壞了第一次閱讀金庸小說的樂趣。 至於已看過金庸原著的朋友,歡迎一起分享你的觀點,小說劇情本就會各有解讀,各有領會,這才是現代文學的魅力!
Ni 1968的沙龍的其他內容
2024/12/21
介紹如何使用 JavaScript 中的陣列基本增刪元素方法,包括新增、刪除和替換元素的詳細說明。介紹的主要方法有 unshift、push、shift、pop、splice 和 slice,並解釋它們的使用場景和返回值。
Thumbnail
2024/12/21
介紹如何使用 JavaScript 中的陣列基本增刪元素方法,包括新增、刪除和替換元素的詳細說明。介紹的主要方法有 unshift、push、shift、pop、splice 和 slice,並解釋它們的使用場景和返回值。
Thumbnail
2024/09/16
howler.js是一個強大的 JavaScript 音效庫,可以方便地在網頁上播放音效。 在 Vue.js 中使用 Howler.js 可以輕鬆地管理和播放音效。
Thumbnail
2024/09/16
howler.js是一個強大的 JavaScript 音效庫,可以方便地在網頁上播放音效。 在 Vue.js 中使用 Howler.js 可以輕鬆地管理和播放音效。
Thumbnail
2024/08/08
如何在 Vite 專案中安裝和設置 TypeScript 及路徑別名的步驟,包括安裝必要的依賴、配置 vite.config.js、tsconfig.json 的設置,及如何創建類型聲明文件來正確識別 .vue 文件。
Thumbnail
2024/08/08
如何在 Vite 專案中安裝和設置 TypeScript 及路徑別名的步驟,包括安裝必要的依賴、配置 vite.config.js、tsconfig.json 的設置,及如何創建類型聲明文件來正確識別 .vue 文件。
Thumbnail
看更多
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
先前提到 Quasar 的 Dialog Plugin 很好用,再讓我補充一個用法。
Thumbnail
先前提到 Quasar 的 Dialog Plugin 很好用,再讓我補充一個用法。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News