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

一文分享5個Vue性能優(yōu)化的寫法

 更新時間:2026年03月18日 14:54:29   作者:程序員大華  
防抖和節(jié)流大家都用過,但 Vue性能優(yōu)化其實不止這兩種,所以這篇文章小編為大家整理了五大用的 vue 性能優(yōu)化寫法,希望對大家有一定的幫助

防抖和節(jié)流大家都用過,但 Vue性能優(yōu)化其實不止這兩種。在日常開發(fā)里,有很多實用的方法,可以讓頁面更順暢。

于是我整理了幾個常用的 vue 性能優(yōu)化寫法,自己用起來也很順手。

1. 避免模板中的重復(fù)計算

我以前喜歡直接在模板中寫一些計算邏輯,雖然它能快速實現(xiàn)需求,但如果不小心,可能會影響性能。尤其是當(dāng)組件頻繁更新時,重復(fù)計算的開銷就會顯現(xiàn)出來。

基礎(chǔ)寫法

<template>
  <div v-for="item in list" :key="item.id">
    商品:{{ item.name }}
    價格:{{ formatPrice(item.price) }}
  </div>
</template>
<script setup>
import { ref } from "vue"
const list = ref([
  { id: 1, name: "鍵盤", price: 1999 },
  { id: 2, name: "鼠標", price: 299 },
  { id: 3, name: "顯示器", price: 3999 }
])
const formatPrice = (price) => {
  return "¥" + (price / 100).toFixed(2)
}
</script>

問題:每次渲染時,formatPrice 會重新計算,假如列表有幾百個條目,這個性能損耗就會變得明顯。

優(yōu)化寫法

可以使用 Vue3 的 computed 屬性,提前計算好需要的數(shù)據(jù),避免每次都執(zhí)行復(fù)雜的計算。

<template>
  <div v-for="item in formattedList" :key="item.id">
    商品:{{ item.name }}
    價格:{{ item.priceText }}
  </div>
</template>
<script setup>
import { ref, computed } from "vue"
const list = ref([
  { id: 1, name: "鍵盤", price: 1999 },
  { id: 2, name: "鼠標", price: 299 },
  { id: 3, name: "顯示器", price: 3999 }
])
const formattedList = computed(() => {
  return list.value.map(item => ({
    ...item,
    priceText: "¥" + (item.price / 100).toFixed(2)
  }))
})
</script>

優(yōu)化效果:只有 list 數(shù)據(jù)發(fā)生變化時,formattedList 才會重新計算,避免了每次渲染時都重新格式化價格,提升了性能。

2. 合理使用 v-if 和 v-show

在 Vue3 中,v-ifv-show 都可以控制組件或元素的顯示,但如果用得不對,也會影響性能。

場景示例

假設(shè)有一個選項卡組件,用戶頻繁切換內(nèi)容:

<template>
  <button @click="tab = 1">Tab 1</button>
  <button @click="tab = 2">Tab 2</button>

  <div v-if="tab === 1">內(nèi)容 1</div>
  <div v-if="tab === 2">內(nèi)容 2</div>
</template>

<script setup>
import { ref } from "vue"
const tab = ref(1)
</script>

問題:每次切換 tab 時,v-if 都會銷毀和重建對應(yīng) DOM,如果內(nèi)容復(fù)雜或包含子組件,性能開銷明顯。

優(yōu)化寫法:使用v-show

<template>
  <button @click="tab = 1">Tab 1</button>
  <button @click="tab = 2">Tab 2</button>

  <div v-show="tab === 1">內(nèi)容 1</div>
  <div v-show="tab === 2">內(nèi)容 2</div>
</template>

優(yōu)化效果v-show 只是切換元素的 CSS display,不會頻繁銷毀和重建 DOM,適合頻繁切換但數(shù)量有限的場景。

如果是初次渲染開銷大、切換不頻繁,用 v-if;如果是頻繁切換,用 v-show。合理選擇可以明顯提高性能。

3. 懶加載:先渲染用戶可見部分

懶加載是一種非常有效的技術(shù),可以讓頁面內(nèi)容只有在用戶滾動到該部分時才加載,提升首屏加載速度,減少不必要的請求。

基礎(chǔ)寫法

<template>
  <img :src="imageSrc" />
</template>

<script setup>
const imageSrc = "https://example.com/large-image.jpg"
</script>

問題:直接在組件加載時就請求了圖片,導(dǎo)致首屏加載時間增加。

優(yōu)化寫法:圖片懶加載

<template>
  <img v-lazy="imageSrc" />
</template>

<script setup>
import { ref } from "vue"
import { useIntersectionObserver } from "@vueuse/core"

const imageSrc = ref("https://example.com/large-image.jpg")

// 使用 @vueuse/core 的 useIntersectionObserver 來懶加載圖片
useIntersectionObserver(imageRef, () => {
  imageRef.src = imageSrc.value
})
</script>

優(yōu)化效果:只有當(dāng)圖片進入視口時才會開始加載,減少了首屏的資源加載,提高頁面加載速度。

4. 避免過度使用 watch

在 Vue 中,watch 是監(jiān)聽數(shù)據(jù)變化的常用方式,但如果用得不當(dāng),會導(dǎo)致多次不必要的計算和請求,增加性能開銷。

基礎(chǔ)寫法

<template>
  <input v-model="searchQuery" placeholder="搜索" />
</template>

<script setup>
import { ref, watch } from "vue"

const searchQuery = ref("")

watch(searchQuery, (newQuery) => {
  // 每次輸入都會發(fā)請求
  fetch(`/api/search?q=${newQuery}`)
})
</script>

問題:每次 searchQuery 變化時都會觸發(fā)請求,尤其是輸入法彈出時,會多次觸發(fā)請求。

優(yōu)化寫法:使用防抖

<template>
  <input v-model="searchQuery" placeholder="搜索" />
</template>

<script setup>
import { ref, watch } from "vue"

const searchQuery = ref("")
let timeout

watch(searchQuery, (newQuery) => {
  clearTimeout(timeout)
  timeout = setTimeout(() => {
    fetch(`/api/search?q=${newQuery}`)
  }, 500) // 防抖:500ms后才發(fā)送請求
})
</script>

優(yōu)化效果:只有在用戶停止輸入 500 毫秒后才會發(fā)起請求,避免了過于頻繁的請求。

5. 避免重復(fù)綁定事件

在 Vue3 中,每次渲染組件時,都會重新綁定事件。如果綁定事件的元素很多,性能開銷就會加大,尤其是在動態(tài)生成的列表中。

基礎(chǔ)寫法

<template>
  <div v-for="item in list" :key="item.id">
    <button @click="handleClick(item.id)">點擊</button>
  </div>
</template>

<script setup>
const handleClick = (id) => {
  console.log("點擊按鈕", id)
}
</script>

問題:每個 button 都會綁定一個新的事件處理函數(shù),造成不必要的內(nèi)存開銷。

優(yōu)化寫法:事件委托

<template>
  <div @click="handleClick">
    <div v-for="item in list" :key="item.id">
      <button>{{ item.name }}</button>
    </div>
  </div>
</template>

<script setup>
const handleClick = (e) => {
  if (e.target.tagName === 'BUTTON') {
    console.log('點擊按鈕', e.target.innerText)
  }
}
</script>

優(yōu)化效果:通過事件委托,將事件綁定到父元素上,避免了為每個按鈕都單獨綁定事件,大大減少了內(nèi)存開銷。

到此這篇關(guān)于一文分享5個Vue性能優(yōu)化的寫法的文章就介紹到這了,更多相關(guān)Vue性能優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3項目使用pinia狀態(tài)管理器的使用

    vue3項目使用pinia狀態(tài)管理器的使用

    Pinia是一個專為Vue3設(shè)計的現(xiàn)代化狀態(tài)管理庫,本文主要介紹了vue3項目使用pinia狀態(tài)管理器的使用,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • 詳解Vue.js之視圖和數(shù)據(jù)的雙向綁定(v-model)

    詳解Vue.js之視圖和數(shù)據(jù)的雙向綁定(v-model)

    本篇文章主要介紹了Vue.js之視圖和數(shù)據(jù)的雙向綁定(v-model),使用v-model指令,使得視圖和數(shù)據(jù)實現(xiàn)雙向綁定,有興趣的可以了解一下
    2017-06-06
  • Vue 自定義動態(tài)組件實例詳解

    Vue 自定義動態(tài)組件實例詳解

    vue的ui組件庫很多種,但是這么多的組件庫也不能滿足我們的開發(fā)需求,所以需要我們根據(jù)自己需求自己寫一個插件,下文小編通過兩個栗子給大家介紹js自定義組件的方法,感興趣的朋友一起看看吧
    2018-03-03
  • Echart圖表在項目中的前后端使用詳解

    Echart圖表在項目中的前后端使用詳解

    圖表在我們的項目中可以幫我們很明確的看到我們想要看到的數(shù)據(jù),本文將主要介紹Echart圖表在項目中前后端使用的詳細教程,感興趣的同學(xué)可以學(xué)習(xí)一下
    2021-11-11
  • Vue組件化編程詳解

    Vue組件化編程詳解

    文章介紹了Vue中組件的基本使用、定義、注冊、書寫標簽和嵌套等關(guān)鍵步驟和注意事項,詳細解釋了組件的配置選項、如何通過Vue.extend創(chuàng)建組件以及組件實例對象與Vue實例對象的區(qū)別,還提及了單文件組件的結(jié)構(gòu)和編寫邏輯,并強調(diào)了組件原型鏈的重要性
    2025-10-10
  • vue如何動態(tài)獲取當(dāng)前時間

    vue如何動態(tài)獲取當(dāng)前時間

    這篇文章主要介紹了vue如何動態(tài)獲取當(dāng)前時間問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • vue實現(xiàn)導(dǎo)出word文檔功能實例(含多張圖片)

    vue實現(xiàn)導(dǎo)出word文檔功能實例(含多張圖片)

    項目需要導(dǎo)出word,于是乎又是查閱資料,然后自己寫,下面這篇文章主要給大家介紹了關(guān)于vue實現(xiàn)導(dǎo)出word文檔功能(含多張圖片)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • 基于vue循環(huán)列表時點擊跳轉(zhuǎn)頁面的方法

    基于vue循環(huán)列表時點擊跳轉(zhuǎn)頁面的方法

    今天小編就為大家分享一篇基于vue循環(huán)列表時點擊跳轉(zhuǎn)頁面的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • vue中slot(插槽)的介紹與使用

    vue中slot(插槽)的介紹與使用

    這篇文章主要給大家介紹了關(guān)于vue中slot(插槽)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • elementui彈窗頁按鈕重復(fù)提交問題解決方法

    elementui彈窗頁按鈕重復(fù)提交問題解決方法

    本文主要介紹了elementui彈窗頁按鈕重復(fù)提交問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08

最新評論

贵溪市| 汉川市| 双峰县| 萨迦县| 寿光市| 阿克| 呼图壁县| 霍州市| 易门县| 柘城县| 柏乡县| 天长市| 永德县| 精河县| 闸北区| 岳阳市| 康马县| 凉山| 宁武县| 周宁县| 邹平县| 两当县| 额敏县| 泸定县| 永胜县| 兴文县| 宜州市| 墨江| 甘肃省| 临城县| 屯门区| 革吉县| 台山市| 沙坪坝区| 资兴市| 梧州市| 台前县| 博兴县| 昌黎县| 宁陵县| 房山区|