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

Vue3中的組件數(shù)據(jù)懶加載

 更新時間:2023年10月21日 17:07:57   作者:itpeilibo  
這篇文章主要介紹了Vue3中的組件數(shù)據(jù)懶加載問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

組件數(shù)據(jù)懶加載-基本使用

目標:通過useIntersectionObserver優(yōu)化新鮮好物和人氣推薦模塊

電商類網(wǎng)站,尤其是首頁,內(nèi)容有好幾屏,而如果一上來就加載所有屏的數(shù)據(jù),并渲染所有屏的內(nèi)容會導致首頁加載很慢。

數(shù)據(jù)懶加載:等組件正式進入到可視區(qū)中時,才把組件內(nèi)部的ajax請求發(fā)起,否則不請求數(shù)據(jù)

(1)優(yōu)化新鮮好物

<script lang="ts" setup>
const { home } = useStore()
const target = ref(null)
const { stop } = useIntersectionObserver(target, ([{ isIntersecting }]) => {
  console.log(isIntersecting)
  // isIntersecting 是否進入可視區(qū)域,true是進入 false是移出
  if (isIntersecting) {
    home.getNewList()
    stop()
  }
})
</script>

<template>
  <div class="home-new">
    <HomePanel ref="target" title="新鮮好物" sub-title="新鮮出爐 品質(zhì)靠譜">
    </HomePanel>
  </div>
</template>

(2)優(yōu)化人氣推薦

<script lang="ts" setup>
const { home } = useStore()
const target = ref(null)
const { stop } = useIntersectionObserver(target, ([{ isIntersecting }]) => {
  console.log(isIntersecting)
  // isIntersecting 是否進入可視區(qū)域,true是進入 false是移出
  if (isIntersecting) {
    home.getHotList()
    stop()
  }
})
</script>
<template>
  <HomePanel ref="target" title="人氣推薦" sub-title="人氣爆款 不容錯過">

  </HomePanel>
</template>

給ref添加組件類型

參考鏈接:https://staging-cn.vuejs.org/guide/typescript/composition-api.html#typing-component-template-refs

<!-- App.vue -->
<script setup lang="ts">
import MyModal from './MyModal.vue'

const modal = ref<InstanceType<typeof MyModal> | null>(null)

const openModal = () => {
  modal.value?.open()
}
</script>

組件數(shù)據(jù)懶加載-封裝

目標:

封裝組件數(shù)據(jù)懶加載可復用的邏輯

分析:

  • 首頁中,很多地方都應(yīng)該使用組件數(shù)據(jù)懶加載這個功能,不管是哪個模塊使用,下面代碼都會重復書寫
  • 事實上,唯一可能會隨著業(yè)務(wù)使用發(fā)生變化的是 ajax接口的調(diào)用
  • 其余的部分我們進行重復使用,抽離為可復用邏輯

核心代碼

(1)封裝通用的懶加載數(shù)據(jù)api src/utils/hooks.ts

// 自定義一些通用的compositions api
import { useIntersectionObserver } from '@vueuse/core'
import { ref } from 'vue'

// 封裝通用的數(shù)據(jù)懶加載api
export function useLazyData(apiFn: () => void) {
  // 通過 ref 獲得組件實例
  const target = ref(null)
  const { stop } = useIntersectionObserver(
    // target 是觀察的目標dom容器,必須是dom容器,而且是vue3.0方式綁定的dom對象
    target,
    // isIntersecting 是否進入可視區(qū)域,true是進入 false是移出
    // observerElement 被觀察的dom
    ([{ isIntersecting }]) => {
      // 在此處可根據(jù)isIntersecting來判斷,然后做業(yè)務(wù)
      if (isIntersecting) {
        stop()
        apiFn()
      }
    }
  )
  return target
}

(2)優(yōu)化新鮮好物

<script lang="ts" setup>
const target = useLazyData(() => {
  home.getNewList()
})
</script>
<template>
  <div class="home-new">
    <HomePanel ref="target" title="新鮮好物" sub-title="新鮮出爐 品質(zhì)靠譜">
    </HomePanel>
  </div>
</template>

(3)優(yōu)化人氣推薦

<script lang="ts" setup>
const target = useLazyData(() => {
  home.getHotList()
})
</script>
<template>
  <HomePanel ref="target" title="人氣推薦" sub-title="人氣爆款 不容錯過">
  </HomePanel>
</template>

拓展小知識:自定義lazyhook的類型優(yōu)化

export function useLazyApi(apiFn: () => void) {
  const target = ref<MaybeElementRef | null>(null)
  const {stop} = useIntersectionObserver(target, ([{isIntersecting}]) => {
    if (isIntersecting) {
      stop()
      apiFn()
    }
  })
  return target
}

添加了ref類型提示:MaybeElementRef -> 暴露出去的taget如果賦值類型不對會進行提示

在這里插入圖片描述

看一下MaybeElementRef到底是什么類型?

declare type MaybeElementRef<T extends MaybeElement = MaybeElement> = MaybeRef<T>;
declare type MaybeElement = HTMLElement | SVGElement | VueInstance | undefined | null;
declare type MaybeRef<T> = T | Ref<T>;

心得:

MaybeElementRef類型的類型為:

  • MaybeElement的Ref類型
  • 或者直接為MayBeElement類型

首頁主體-滾動加載商品的bug

  • 產(chǎn)品區(qū)域需要滾動比較多才能去加載數(shù)據(jù)。
  • threshold 容器和可視區(qū)交叉的占比(進入的面積/容器完整面積) 取值,0-1 之間,默認比0大,所以需要滾動較多才能觸發(fā)進入可視區(qū)域事件。 閾值 (進入的面積/容器完整面積)
const { stop } = useIntersectionObserver(
  target,
  ([{ isIntersecting }], observerElement) => {
    if (isIntersecting) {
      stop()
      // 調(diào)用API獲取數(shù)據(jù)
      apiFn().then(data => {
        result.value = data.result
      })
    }
  },
  {
    threshold: 0
  }
)
rElement) => {
    if (isIntersecting) {
      stop()
      // 調(diào)用API獲取數(shù)據(jù)
      apiFn().then(data => {
        result.value = data.result
      })
    }
  },
  {
    threshold: 0
  }
)

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • LogicFlow內(nèi)置插件使用實例

    LogicFlow內(nèi)置插件使用實例

    這篇文章主要為大家介紹了LogicFlow內(nèi)置插件使用實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • vue中如何配置proxy代理

    vue中如何配置proxy代理

    這篇文章主要介紹了vue中如何配置proxy代理問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 使用Vue實現(xiàn)防篡改的水印

    使用Vue實現(xiàn)防篡改的水印

    我們在平時上網(wǎng)的時候會看到有些圖片是加水印的,一般水印往往是后端來做的,不過有些站點要保護的知識產(chǎn)權(quán)類型比較多,不光是圖片,可能還有視頻或者文字,所以我們水印的作用,就是給他做一個適當?shù)南拗?本文就給大家介紹一下如何使用Vue實現(xiàn)防篡改的水印
    2023-08-08
  • Vue路由組件的緩存keep-alive和include屬性的具體使用

    Vue路由組件的緩存keep-alive和include屬性的具體使用

    :瀏覽器頁面在進行切換時,原有的路由組件會被銷毀,通過緩存可以保存被切換的路由組件,本文主要介紹了Vue路由組件的緩存keep-alive和include屬性的具體使用,感興趣的可以了解一下
    2023-11-11
  • 關(guān)于Element?table組件滾動條不顯示的踩坑記錄

    關(guān)于Element?table組件滾動條不顯示的踩坑記錄

    這篇文章主要介紹了關(guān)于Element?table組件滾動條不顯示的踩坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue.config.js中配置configureWebpack和chainWebpack以及一些常用的配置

    vue.config.js中配置configureWebpack和chainWebpack以及一些常用的配置

    configureWebpack和chainWebpack都是Vue CLI中用于修改Webpack配置的工具,configureWebpack可以通過對象或函數(shù)修改配置,簡單直接;chainWebpack則使用WebpackChainAPI,適合復雜配置,兩者可以結(jié)合使用,以達到更精細的配置需求,幫助開發(fā)者優(yōu)化項目構(gòu)建
    2024-10-10
  • Vue中使用touchstart、touchmove、touchend與click沖突問題

    Vue中使用touchstart、touchmove、touchend與click沖突問題

    這篇文章主要介紹了Vue中使用touchstart、touchmove、touchend與click沖突問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 使用vuedraggable實現(xiàn)從左向右拖拽功能

    使用vuedraggable實現(xiàn)從左向右拖拽功能

    這篇文章主要為大家詳細介紹了使用vuedraggable實現(xiàn)從左向右拖拽功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 在Vue中定義全局方法的實現(xiàn)方式

    在Vue中定義全局方法的實現(xiàn)方式

    在 Vue 項目中定義全局方法可以讓你在任意組件中復用邏輯,避免重復代碼,不同的 Vue 版本和不同的應(yīng)用場景下,實現(xiàn)方式略有不同,本文給大家介紹了在Vue中定義全局方法的不同實現(xiàn)方式,需要的朋友可以參考下
    2025-10-10
  • vuex數(shù)據(jù)持久化的兩種實現(xiàn)方案

    vuex數(shù)據(jù)持久化的兩種實現(xiàn)方案

    在vuex的時候刷新以后里面存儲的state就會被瀏覽器釋放掉,因為我們的state都是存儲在內(nèi)存中的,所以一刷新頁面就會把state中的數(shù)據(jù)重置,這就涉及到vue數(shù)據(jù)持久化的問題,這篇文章主要給大家介紹了關(guān)于vuex數(shù)據(jù)持久化的兩種實現(xiàn)方案,需要的朋友可以參考下
    2021-07-07

最新評論

宁安市| 凌云县| 宜宾县| 宁阳县| 山阳县| 金沙县| 永福县| 定远县| 鹤山市| 平乐县| 临高县| 山阳县| 武冈市| 无为县| 黎城县| 台东市| 渭南市| 遂昌县| 长武县| 永安市| 武威市| 鄱阳县| 买车| 沾化县| 方城县| 炉霍县| 抚顺县| 贵港市| 财经| 美姑县| 南皮县| 耒阳市| 独山县| 五台县| 嘉善县| 大方县| 怀安县| 凤庆县| 博乐市| 溧阳市| 从江县|