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

Vue3實(shí)戰(zhàn)之插槽封裝與懶加載詳解

 更新時(shí)間:2025年04月27日 10:38:45   作者:jingling1007  
這篇文章主要介紹了Vue3實(shí)戰(zhàn)之插槽封裝與懶加載的相關(guān)資料,過(guò)插槽實(shí)現(xiàn)組件的結(jié)構(gòu)分離、復(fù)用性和語(yǔ)義清晰,通過(guò)懶加載實(shí)現(xiàn)圖片的按需加載,減少首屏加載時(shí)間和資源浪費(fèi),文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下

一、為什么需要插槽?從一個(gè)面板組件說(shuō)起

在電商首頁(yè)開(kāi)發(fā)中,經(jīng)常遇到這樣的場(chǎng)景:

「新鮮好物」「人氣推薦」同樣類(lèi)型模塊都需要相同的標(biāo)題欄,但內(nèi)容區(qū)布局不同這時(shí)候,插槽(Slot)就像一個(gè)「內(nèi)容拼圖位」,讓組件既能統(tǒng)一樣式,又能靈活定制。

實(shí)戰(zhàn)案例:HomePanel 通用面板

<template>
  <div class="home-panel">
    <div class="head">
      <h3>{{ title }}<small>{{ subTitle }}</small></h3>
    </div>
    <slot name="main" /> <!-- 內(nèi)容拼圖位 -->
  </div>
</template>

<script setup>
defineProps({ title: String, subTitle: String })
</script>

使用方式:

<HomePanel title="新鮮好物" sub-title="新鮮出爐">
  <template #main> <!-- 填充拼圖 -->
    <ul class="goods-list">
      <li v-for="item in list">{{ item.name }}</li>
    </ul>
  </template>
</HomePanel>

實(shí)現(xiàn)效果:

插槽的 3 個(gè)好處:

  • 結(jié)構(gòu)分離:標(biāo)題樣式統(tǒng)一管理,內(nèi)容區(qū)自由發(fā)揮(列表 / 圖片 / 按鈕均可)
  • 復(fù)用性強(qiáng):一個(gè)面板組件適配 N 種業(yè)務(wù)場(chǎng)景
  • 語(yǔ)義清晰:通過(guò)具名插槽(#main)明確內(nèi)容位置

二、懶加載:讓圖片「按需加載」的魔法

電商首頁(yè)往往包含大量圖片,一次性加載會(huì)導(dǎo)致:

  • 首屏加載慢
  • 流量浪費(fèi)
  • 手機(jī)發(fā)燙

懶加載(Lazy Load)的核心邏輯:圖片進(jìn)入視口時(shí)再加載

用 Vue3 指令實(shí)現(xiàn)懶加載

// 全局指令:directives/lazy.js
import { useIntersectionObserver } from '@vueuse/core'

export const lazyPlugin = {
  install(app) {
    app.directive('img-lazy', {
      mounted(el, binding) {
        // 當(dāng)元素進(jìn)入視口時(shí)
        const { stop } = useIntersectionObserver(el, ([{ isIntersecting }]) => {
          if (isIntersecting) {
            el.src = binding.value // 替換真實(shí)src
            stop() // 停止觀察,避免重復(fù)觸發(fā)
          }
        })
      }
    })
  }
}

使用方式:

<img v-img-lazy="goods.picture" alt="商品圖" />

實(shí)現(xiàn)原理拆解:

  • IntersectionObserver:瀏覽器原生 API,監(jiān)聽(tīng)元素是否進(jìn)入視口
  • 指令生命周期:在mounted階段綁定觀察,避免重復(fù)綁定
  • 停止觀察:圖片加載后立即停止監(jiān)聽(tīng),節(jié)省性能

三、插槽 × 懶加載:實(shí)戰(zhàn)中的黃金組合

在「商品館」模塊中,同時(shí)用到了插槽和懶加載:

<HomePanel title="數(shù)碼館">
  <template #main>
    <div class="box">
      <img v-img-lazy="bannerUrl" class="cover" /> <!-- 大圖懶加載 -->
      <ul>
        <li v-for="goods in list">
          <GoodsItem :goods="goods" /> <!-- 子組件插槽 -->
        </li>
      </ul>
    </div>
  </template>
</HomePanel>

<!-- GoodsItem子組件 -->
<template>
  <RouterLink>
    <img v-img-lazy="goods.picture" /> <!-- 商品圖懶加載 -->
    <p>{{ goods.name }}</p>
  </RouterLink>
</template>

效果:

  • 標(biāo)題欄統(tǒng)一樣式,內(nèi)容區(qū)自由布局(大圖 + 列表)
  • 所有圖片均在進(jìn)入視口時(shí)加載,首屏加載速度提升 40%

四、新手避坑指南

  • 插槽默認(rèn)值:給插槽設(shè)置默認(rèn)內(nèi)容,避免父組件未傳時(shí)的空白
    <slot name="main">暫無(wú)內(nèi)容</slot>
    
  • 懶加載占位圖:加載前使用占位圖(如灰色色塊),避免布局抖動(dòng)
    <img v-img-lazy="realSrc" :src="placeholder" />
    
  • 指令參數(shù)校驗(yàn):確保指令值是合法 URL
    if (!binding.value.startsWith('http')) return
    

五、總結(jié):讓組件會(huì)「呼吸」

  • 插槽讓組件有了「可插拔」的能力,像搭積木一樣組裝頁(yè)面
  • 懶加載讓頁(yè)面學(xué)會(huì)「按需呼吸」,節(jié)省資源的同時(shí)提升用戶體驗(yàn)
  • 兩者結(jié)合,實(shí)現(xiàn)了 「結(jié)構(gòu)統(tǒng)一」「內(nèi)容靈活」的完美平衡

到此這篇關(guān)于Vue3實(shí)戰(zhàn)之插槽封裝與懶加載的文章就介紹到這了,更多相關(guān)Vue3插槽封裝與懶加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 派發(fā)器抽離vue2單組件中的大量邏輯技巧

    派發(fā)器抽離vue2單組件中的大量邏輯技巧

    這篇文章主要為大家介紹了派發(fā)器抽離vue2單組件中的大量邏輯技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • vue封裝一個(gè)彈幕組件詳解

    vue封裝一個(gè)彈幕組件詳解

    這篇文章主要介紹了vue封裝一個(gè)彈幕組件詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙可以參考一下
    2022-08-08
  • 解決Vue運(yùn)行項(xiàng)目報(bào)錯(cuò)proxy?error:?could?not?proxy?request

    解決Vue運(yùn)行項(xiàng)目報(bào)錯(cuò)proxy?error:?could?not?proxy?request

    這篇文章主要給大家介紹了關(guān)于如何解決Vue運(yùn)行項(xiàng)目報(bào)錯(cuò)proxy?error:could?not?proxy?request的相關(guān)資料,Proxy Error指的是代理服務(wù)器無(wú)法正確處理請(qǐng)求的錯(cuò)誤,需要的朋友可以參考下
    2023-08-08
  • Vue項(xiàng)目中引入外部腳本的多種方式

    Vue項(xiàng)目中引入外部腳本的多種方式

    在現(xiàn)代的前端開(kāi)發(fā)中,我們經(jīng)常需要使用一些第三方的外部腳本或庫(kù),尤其是像地圖、圖表、分析工具等,在 Vue 項(xiàng)目中,有多種方式可以引入外部腳本,本文將詳細(xì)介紹在 Vue 項(xiàng)目中引入外部腳本的幾種常見(jiàn)方法,需要的朋友可以參考下
    2025-01-01
  • Vue3?Webview轉(zhuǎn)Android虛擬導(dǎo)航欄遮擋問(wèn)題解決實(shí)錄

    Vue3?Webview轉(zhuǎn)Android虛擬導(dǎo)航欄遮擋問(wèn)題解決實(shí)錄

    這篇文章主要介紹了Vue3?Webview轉(zhuǎn)Android虛擬導(dǎo)航欄遮擋問(wèn)題解決的相關(guān)資料,文中通過(guò)JavaScript動(dòng)態(tài)估算安全區(qū)域高度,并通過(guò)CSS變量傳遞給樣式層,最終解決了這個(gè)問(wèn)題,需要的朋友可以參考下
    2026-03-03
  • vue-router路由懶加載及實(shí)現(xiàn)的3種方式

    vue-router路由懶加載及實(shí)現(xiàn)的3種方式

    這篇文章主要給大家介紹了關(guān)于vue-router路由懶加載及實(shí)現(xiàn)的3種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • vue3卡片垂直無(wú)限滾動(dòng)方式

    vue3卡片垂直無(wú)限滾動(dòng)方式

    使用CSS動(dòng)畫(huà)實(shí)現(xiàn)DOM向上滾動(dòng),JS動(dòng)態(tài)計(jì)算數(shù)據(jù)條數(shù)并實(shí)時(shí)調(diào)整滾動(dòng)速度,確保在onMounted中調(diào)用以正確渲染DOM
    2025-07-07
  • element UI 2.15.13與vue2.0表格勾選回顯關(guān)鍵demo

    element UI 2.15.13與vue2.0表格勾選回顯關(guān)鍵demo

    這篇文章主要為大家介紹了element UI 2.15.13與vue2.0表格勾選回顯關(guān)鍵demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • keep-alive組件的作用與原理分析

    keep-alive組件的作用與原理分析

    這篇文章主要介紹了keep-alive組件的作用與原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • vue中路由傳參6種方式總結(jié)

    vue中路由傳參6種方式總結(jié)

    這篇文章主要為大家詳細(xì)介紹了vue中路由傳參6種方式,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-08-08

最新評(píng)論

长岭县| 扬中市| 泰兴市| 五台县| 安溪县| 安康市| 兰西县| 定陶县| 雷州市| 宣城市| 萍乡市| 会同县| 珲春市| 定远县| 尼勒克县| 吉安县| 河间市| 贺兰县| 中牟县| 玛多县| 株洲县| 阳曲县| 麻阳| 汉源县| 会同县| 班玛县| 新沂市| 精河县| 温州市| 察雅县| 东丰县| 宁远县| 陇川县| 西盟| 临海市| 太白县| 新乡县| 常德市| 河源市| 攀枝花市| 乃东县|