Vue 性能革命:揭秘前端優化的終極技巧;Vue優化技巧,解決Vue項目卡頓問題

目錄

Vue優化路徑

一、使用key

二、使用凍結對象

三、使用函數式組件

四、使用計算屬性

五、使用非實時綁定的表單項

六、保持對象引用穩定

6.1、保持對象引用穩定定義

6.2、保持對象引用穩定與不穩定的例子

6.3、vue2判斷數據是否變化是通過hasChanged函數實現的

①為什么在x === y成立的時候,還要做一個return x === 0 && 1 / x !== 1 / (y as number)的判斷?

②為什么在 x === y 不成立的時候,還要做一個x === x || y === y的判斷?

七、使用v-show替代v-if

八、使用延遲裝載(defer)

九、使用keep-alive

十、長列表優化

十一、打包體積優化

十二、總結與相關資源


Vue優化路徑

一、使用key

????????也就是使用v-for這樣通過循環生成的列表,應給每個列表項一個穩定且唯一的key,這樣有利于在列表變動時,盡量少的刪除、新增、改動元素。

二、使用凍結對象

????????在不需要改動的數據時(比如只讀的數據:面向顧客的商品列表等),將對象凍結。例如:

var obj = { a : 1, b : 2}Object.freeze(obj)obj.a = 3 // 無效,obg.a依然為1// 此時obj的屬性無法訪問,自然也無法通過Object.defineProperty來實現響應式Object.isFrozen(obj) // 返回true,檢查是否凍結

????????凍結的對象不會被響應化,節約了observe該對象每個屬性的資源(添加getter和setter)

? ? ? ? 舉一個例子,可以做一個demo實際體驗一下效率的區別,做個頁面放兩個按鈕,分別綁定loadFrozenDatas和loadNormalDatas方法,就能明顯感受到生成同樣的數據,凍結的對象生成速度顯著快于不凍結的對象生成。

data() {return{normalDatas: [],freezeDatas: [],};
},
methods: {loadNormalDatas(){this.normalDatas = this.getDatas(); console.log("normalDatas", this.normalDatas);},loadFrozenDatas() {this.freezeDatas = Object.freeze(this.getDatas()); console.log("freezeDatas", this.freezeDatas);},getDatas(){const result = [];for (var i = 0; i < 1000000; i++) {result.push({id: i,name:`name${i}`,address:{city:`city${i}`,province:`province${i}`,},});}return result;},
}

observe中會調用Object.defineProperty(),通過屬性描述符為對象的每個屬性實現響應式

屬性描述符詳情請看:屬性描述符初探——Vue實現數據劫持的基礎

三、使用函數式組件

????????在Vue.js中,函數式組件是一種沒有狀態和實例的概念的組件。函數式組件主要用于聲明性地描述UI,它們接受 props 作為輸入,并返回一個Vue元素樹作為輸出。

????????函數式組件不會通過new VueComponent生成新的vue實例,不會加入到vue的組件樹中,只做頁面渲染,節省性能。

// Vue 2中的函數式組件:Vue.component('my-functional-component', {functional: true,render: function (createElement, context) {// 使用createElement創建元素return createElement('div', context.props.text);}
});// Vue 3中的函數式組件:import { h, FunctionalComponent } from 'vue';const MyFunctionalComponent: FunctionalComponent = (props, { slots }) => {return h('div', props.text, slots().default);
};export default MyFunctionalComponent;

四、使用計算屬性

????????計算屬性可以緩存(只有所依賴的數據變化了才會重新計算),如果模版中數據會使用多次,就可以使用計算屬性。

五、使用非實時綁定的表單項

????????雙向綁定會導致任意一端修改數據均會導致重渲染rerender,在不需要雙向綁定的位置(比如只開放只讀數據)或者不需要保持實時數據雙向綁定的情況下(比如輸入框內容和頁面某元素綁定,輸入過程中每按一次鍵盤都會導致一次重新渲染)不使用v-model。

? ? ? ? 也可以通過v-model.lazy來允許某一時間內數據與表單內容不一致,也就是從監聽@input變成了監聽@change。

六、保持對象引用穩定

6.1、保持對象引用穩定定義

????????大多數情況下,vue觸發重渲染的時機是依賴數據發生變化的時機,若數據沒有變化,哪怕重新給數據賦值,vue也不會做出反應。

? ? ? ? 因此,哪怕讀取屬性所屬的對象值沒變,但是引用變了,也會導致頁面重新渲染。?

6.2、保持對象引用穩定與不穩定的例子

????????現在頁面上渲染了一個表格,由一系列對象數據生成。如果要在數據庫增加一行。那么讀取數據庫增加的數據,并將其添加到現有的表格數據中,效率會比直接從數據庫讀取全部數據,然后賦值給表格綁定的數據上要高。

? ? ? ? 因為讀取增加的數據,然后修改表格綁定的數據,只有變化的數據會重新渲染,原先有的表格行不會重渲染,可如果直接把增加后的全部數據(一個引用不同的新對象)賦值給表格綁定的數據,就會導致所有行全部重新渲染,哪怕大多數行數據并沒有變化

6.3、vue2判斷數據是否變化是通過hasChanged函數實現的

function hasChanged(x : unknown, y : unknown) :boolean{if (x === y){return x === 0 && 1 / x !== 1 / (y as number)} else {return x === x || y === y}
}

????????這里x與y分別是新值和舊值。

????????正常情況下,如果x===y,代表沒有改變,返回false,反之則返回true。

①為什么在x === y成立的時候,還要做一個return x === 0 && 1 / x !== 1 / (y as number)的判斷?

????????+0 === -0的判斷恒為true,但二者實際不相等。所以先判斷x是否為0+或0-,如果不是,則直接觸發短路返回false,如果是,就通過求倒數,比較倒數是否相等,如果均為0+或均為0-,則依然返回false,若倒數為Infinity和-Infinity,這樣就會返回true,從而排除從0+變為0-,但是卻新舊值卻相等的情況。

②為什么在 x === y 不成立的時候,還要做一個x === x || y === y的判斷?

????????因為如果NaN === NaN的判斷恒為false,所以哪怕不相等,還要做一下自判斷,若新舊值都是NaN,則返回false。排除x與y都為NaN,但是新舊值卻不相等的情況。

七、使用v-show替代v-if

????????對于頻繁切換顯示狀態的元素,使用v-show可以保證虛擬dom樹的穩定,尤其是對于那些內部包含大量dom元素的節點,這一點極其重要。

? ? ? ? DOM樹只與布局有關,與顯示與否無關。使用v-show渲染的元素,不管返回值是什么,都會添加到dom樹中,但是使用v-if渲染的元素,只有為true的時候才會添加到DOM樹中。

八、使用延遲裝載(defer)

????????HTML中的<script>標簽有一個可選的defer屬性。當腳本設置了defer屬性后,它會被告知瀏覽器在文檔解析完成后再執行這個腳本,而不是立即執行。

????????對于圖片和其他資源,可以使用 v-lazy-image 或 v-lazy-component 這樣的 Vue 指令來實現懶加載。

<!-- 在模板中使用 -->
<img v-lazy="imageSrc" alt="Lazy Image">

????????使用像 vue-lazyload 這樣的庫來實現圖片和組件的懶加載。?

// 安裝 vue-lazyload
npm install vue-lazyload --save// 在 main.js 中使用
import Vue from 'vue';
import VueLazyload from 'vue-lazyload';Vue.use(VueLazyload, {preLoad: 1.64,error: 'error.png',loading: 'loading.png',attempt: 1
});

九、使用keep-alive

????????keep-alive 是 Vue 的一個內置組件,用于緩存不活動的組件實例,避免重復創建和銷毀組件,從而提高性能。這在單頁面應用(SPA)中特別有用,可以保持用戶狀態和避免不必要的重新渲染。

<!-- 在路由出口使用 -->
<router-view v-if="$route.meta.keepAlive"></router-view>
<keep-alive><router-view v-if="!$route.meta.keepAlive"></router-view>
</keep-alive>

? ? ? ? 這里會根據路由的 meta 屬性決定是否使用 keep-alive。

十、長列表優化

????????海量數據渲染容易導致卡頓,除了可以運用第六點保持引用對象穩定外,Vue還提供了幾種方法來優化長列表的渲染:

  • 虛擬滾動(Virtual Scrolling):只渲染可視區域內的元素,而不是渲染整個列表。可以使用 vue-virtual-scroll-list 或 vue-virtual-scroller 等庫來實現。
  • 分頁或無限滾動:將數據分批次加載,而不是一次性加載所有數據。
  • 節流(Throttle)和防抖(Debounce):在處理滾動事件等頻繁觸發的操作時,使用節流或防抖技術減少事件處理的頻率。

????????此外,element plus也提供了虛擬化組件,用來處理海量數據的渲染問題

十一、打包體積優化

????????減少最終打包文件的大小可以提高應用的加載速度和性能。常見方法包括:

  1. 代碼分割(Code Splitting):使用 Webpack 的動態 import() 語法來實現代碼分割,只加載用戶實際需要的代碼。
  2. Tree Shaking:移除未使用的代碼,Webpack 等現代打包工具可以自動進行 Tree Shaking
  3. 使用 Vue CLI 的優化選項:Vue CLI 提供了多種優化配置,如 vue-cli-service build --report 可以生成報告,幫助分析打包體積。
  4. 移除 console.log:在生產環境中,確保移除所有的 console.log 語句,因為它們會增加打包體積。
  5. 使用 Terser 或 UglifyJS 壓縮 JavaScript:這些工具可以壓縮 JavaScript 代碼,減少文件大小。

十二、總結與相關資源

? ? ? ? Vue在處理少量數據和有限dom的情況下技術已經非常成熟了,但現在隨著AI時代的到來,海量數據場景會越來越多,Vue優化技巧也是必備技能。

????????博客不應該只有代碼和解決方案,重點應該在于給出解決方案的同時分享思維模式,只有思維才能可持續地解決問題,只有思維才是真正值得學習和分享的核心要素。如果這篇博客能給您帶來一點幫助,麻煩您點個贊支持一下,還可以收藏起來以備不時之需,有疑問和錯誤歡迎在評論區指出~

????????更多優質內容,請關注:

JS底層邏輯:

????????最細最有條理解析:事件循環(消息循環)是什么?進程與線程的定義、關系與差異

???? ? ?路由通配符,小小的字符有大大的作用,你真的熟悉嗎??

????????管理數據必備!偵聽器watch用法詳解

??? ? ??什么是深拷貝?深拷貝和淺拷貝有什么區別

JS語法篇:

????? ??屬性描述符初探——Vue實現數據劫持的基礎

????????你真的會使用Vue3的onMounted鉤子函數嗎?Vue3中onMounted的用法詳解

????????對象數據的讀取,看這一篇就夠了!

????????通過array.every()實現數據驗證、權限檢查和一致性檢查,array.some與array.every的區別

????????通過array.some()實現權限檢查、表單驗證、庫存管理、內容審查和數據處理

????????通過array.map()實現數據轉換、創建派生數組、異步數據流處理、搜索和過濾等需求

????????通過array.reduce()實現數據匯總、條件篩選和映射、對象屬性的扁平化、轉換數據格式等

????????通過array.filter()實現數組的數據篩選、數據清洗和鏈式調用

巧妙算法與竅門:

????????多維數組操作,不要再用遍歷循環foreach了,來試試數組展平的小妙招!

????????別再用雙層遍歷循環來做新舊數組對比,尋找新增元素了!

????????shpfile轉GeoJSON且控制轉化精度;如何獲取GeoJSON?GeoJson結構詳解

????????Mapbox添加行政區矢量圖層、分級設色圖層、自定義鼠標懸浮框、添加天地圖底圖等

Element plus拓展:

????????通過el-tree自定義渲染網頁版工作目錄,實現鼠標懸浮顯示完整名稱等

????????el-table實現動態數據的實時排序,一篇文章講清楚elementui的表格排序功能

????????el-table中如何添加漸變色帶、多色色帶

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41359.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41359.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41359.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024年【四川省安全員B證】考試及四川省安全員B證考試題

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 2024年【四川省安全員B證】考試及四川省安全員B證考試題&#xff0c;包含四川省安全員B證考試答案和解析及四川省安全員B證考試題練習。安全生產模擬考試一點通結合國家四川省安全員B證考試最新大綱及四川省安全員B證…

golang項目中gorm框架的配置和具體使用

最近在改造golang項目&#xff0c;從postgre數據庫遷移到達夢數據庫&#xff0c;我還想在改造后的項目使用 gorm 操作數據庫&#xff0c;保持較小的改動。查找了不少資料&#xff0c;最終從以下兩篇文章中借鑒了不少 1、Gorm 入門介紹與基本使用 這篇知乎文章詳細介紹了 gorm 框…

C語言 -- 操作符詳解?

C語言 -- 操作符詳解? 1. 操作符的分類2. 二進制和進制轉換?2.1 2進制轉10進制?2.1.1 10進制轉2進制數字? 2.2 2進制轉8進制和16進制?2.2.1 2進制轉8進制?2.2.2 2進制轉16進制? 3. 原碼、反碼、補碼?4. 移位操作符?4.1 左移操作符? 4.2 右移操作符?5. 位操作符&…

Symfony實戰手冊:PHP框架的高級應用技巧

引言 Symfony是一個功能強大且廣泛應用于PHP應用程序開發的框架&#xff0c;它提供了許多高級特性和工具&#xff0c;可以幫助開發人員更高效地構建和管理復雜的Web應用程序。以下是Symfony框架的幾個關鍵方面及其高級應用技巧&#xff1a; 1. 路由和控制器 Symfony的路由組…

suricata7 rule格式

suricata 7.0.5 suricata rule由三部分組成&#xff0c; action, header, options action,決定當前規則匹配上后需要執行的動作header,定義當前規則的協議&#xff0c;IP地址&#xff0c;端口&#xff0c;方向options,定義了具體的規則 一、 action 合法的action值有&#x…

Linux_共享內存通信

目錄 1、共享內存原理 2、申請共享內存 2.1 ftok 2.2 測試shmget、ftok 2.3 查看系統下的共享內存 3、關聯共享內存 3.1 測試shmat 4、釋放共享內存 4.1 測試shmctl 5、實現共享內存通信 6、共享內存的特性 結語 前言&#xff1a; 在Linux下&#xff0c;有一…

爆!Java高級特性之Stream API詳解

爆&#xff01;Java高級特性之Stream API詳解 Java 8引入的Stream API可以說是一個革命性的特性,讓我們告別了又臭又長的for循環,迎來了函數式編程的春天。今天就讓我們來一起深入了解這個讓人又愛又恨的Stream API吧! 什么是Stream? Stream就像一個高級的迭代器,允許我們以…

分支與循環

目錄 1. if語句 1&#xff09;if 2) else 3&#xff09;分支中包含多條語句 4&#xff09;if嵌套 2.關系操作符 3.條件操作符 4.邏輯操作符&#xff1a;&& || ! 1) 邏輯取反運算符 !?編輯 2 與運算符?編輯 3) 或運算符?編輯 4) 閏年的判斷 5) 短路 …

LangChain 概述 (模塊索引)

文章目錄 一、下載二、核心功能1、流式傳輸 streaming 三、LCEL四、組成部分1、Promp template2、Example selectors (示例選擇器)3、Chat models (聊天模型)4、Messages (消息)5、LLMs (大語言模型) 一、下載 二、核心功能 其中包括以下內容&#xff1a; 從模型中返回結構化的…

若依 Vue 前端分離 3.8.8 版中生成的前端代碼中關于下拉框只有下拉箭頭的問題

生成代碼修改前 <el-form-item label"課程學科" prop"subject"><el-select v-model"queryParams.subject" placeholder"請選擇課程學科" clearable><el-optionv-for"dict in course_subject":key"dict…

Mysql中常用函數的使用示例

場景 基礎知識回顧&#xff1a;mysql中常用函數的使用示例。 注&#xff1a; 博客&#xff1a;霸道流氓氣質-CSDN博客 實現 數學函數 -- ABS(x)返回x的絕對值 SELECT ABS(-1),ABS(2); -- PI()返回圓周率 SELECT PI(); -- SQRT(x)返回非負數x的二次方根 SELECT SQRT(4); -…

【博士每天一篇文獻-算法】Adult neurogenesis acts as a neural regularizer

閱讀時間&#xff1a;2023-12-20 1 介紹 年份&#xff1a;2022 作者&#xff1a;Lina M. Tran&#xff0c;Adam Santoro&#xff0c;谷歌DeepMind 期刊&#xff1a; Proceedings of the National Academy of Sciences 引用量&#xff1a;13 代碼&#xff1a;https://github.c…

A4-C四驅高防輪式巡檢機器人

在當今數字化和智能化迅速發展的時代&#xff0c;旗晟智能帶來了一款革命性的創新產品——A4-C四驅高防輪式巡檢機器人。這款機器人以其卓越的性能和多功能性&#xff0c;為工業巡檢領域帶來了全新的解決方案。 一、產品亮點 1、四驅動力與高防護設計 四驅高防輪式巡檢機器人…

ASUS/華碩槍神4 G532L G732L系列 原廠win10系統 工廠文件 帶F12 ASUS Recovery恢復

華碩工廠文件恢復系統 &#xff0c;安裝結束后帶隱藏分區&#xff0c;一鍵恢復&#xff0c;以及機器所有驅動軟件。 系統版本&#xff1a;Windows10 原廠系統下載網址&#xff1a;http://www.bioxt.cn 需準備一個20G以上u盤進行恢復 請注意&#xff1a;僅支持以上型號專用…

GPT-2怎么做翻譯任務?

首先需要知道的是GPT-2無論在訓練還是推理過程都是只使用了transformer decoder&#xff0c;并沒有使用encoder結構&#xff0c;那么它是怎么做的翻譯任務呢&#xff1f; 使用transformer encoderdecoder的著名架構有&#xff1a; 最原始的transformer model&#xff08;Atte…

計算機應用數學--第一次作業

第一次作業計算題編程題 &#xff08;20分&#xff09; 第一次作業 計算題 &#xff08;20分&#xff09;求 E ( X ) E(X) E(X)&#xff0c; V a r ( X ) Var(X) Var(X) &#xff08;1&#xff09; X X X 服從 [ a , b ] [a,b] [a,b] 均勻分布。 &#xff08;2&#xff09;…

操作系統期末必考概念大綱(整理·全)

第一章 1、 操作系統的概念 2、 計算機發展的四個階段 3、 手工操作階段、批處理系統階段、多道程序系統階段、分時操作系統階段、通用操作系統階段 4、 批處理系統&#xff08;聯機、脫機&#xff09; 5、 操作系統的6個基本類型 6、 多道批處理特征 7、 分時系統特點 8、 算法…

第二節-K8s詞匯表

關鍵字詞匯表 https://kubernetes.io/zh-cn/docs/reference/glossary/?fundamentaltrue API Group (API 組)Kubernetes API 中的一組相關路徑。 API 服務器亦稱作:kube-apiserver API 服務器是 Kubernetes 控制平面的組件&#xff0c; 該組件負責公開了 Kubernetes API&…

2024年智慧教育與社會科學國際會議 (ICSSS 2024)

2024年智慧教育與社會科學國際會議 (ICSSS 2024) 2024 International Conference on Smart Education and Social Sciences 【重要信息】 大會地點&#xff1a;北京 大會官網&#xff1a;http://www.icicsss.com 投稿郵箱&#xff1a;icicssssub-conf.com 【注意&#xff1a;稿…

Stable-diffusion-WebUI 的API調用(內含文生圖和圖生圖實例)

前情提要 在之前嘗試使用Diffusers庫來進行stable-diffusion的接口調用以及各種插件功能實現&#xff0c;但發現diffusers庫中各復雜功能的添加較為麻煩&#xff0c;而且難以實現對采樣器的添加&#xff0c;safetensors格式模型的讀取。在官網上找到了webui有專門的api接口&am…