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

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

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

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

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

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

數(shù)據(jù)懶加載:等組件正式進(jìn)入到可視區(qū)中時(shí),才把組件內(nèi)部的ajax請(qǐng)求發(fā)起,否則不請(qǐng)求數(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 是否進(jìn)入可視區(qū)域,true是進(jìn)入 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 是否進(jìn)入可視區(qū)域,true是進(jìn)入 false是移出
  if (isIntersecting) {
    home.getHotList()
    stop()
  }
})
</script>
<template>
  <HomePanel ref="target" title="人氣推薦" sub-title="人氣爆款 不容錯(cuò)過">

  </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ù)懶加載-封裝

目標(biāo):

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

分析:

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

核心代碼

(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 獲得組件實(shí)例
  const target = ref(null)
  const { stop } = useIntersectionObserver(
    // target 是觀察的目標(biāo)dom容器,必須是dom容器,而且是vue3.0方式綁定的dom對(duì)象
    target,
    // isIntersecting 是否進(jìn)入可視區(qū)域,true是進(jìn)入 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="人氣爆款 不容錯(cuò)過">
  </HomePanel>
</template>

拓展小知識(shí):自定義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如果賦值類型不對(duì)會(huì)進(jìn)行提示

在這里插入圖片描述

看一下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類型

首頁(yè)主體-滾動(dòng)加載商品的bug

  • 產(chǎn)品區(qū)域需要滾動(dòng)比較多才能去加載數(shù)據(jù)。
  • threshold 容器和可視區(qū)交叉的占比(進(jìn)入的面積/容器完整面積) 取值,0-1 之間,默認(rèn)比0大,所以需要滾動(dòng)較多才能觸發(fā)進(jìn)入可視區(qū)域事件。 閾值 (進(jìn)入的面積/容器完整面積)
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é)

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

相關(guān)文章

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

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

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

    vue中如何配置proxy代理

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

乐东| 葫芦岛市| 定陶县| 蓬莱市| 松溪县| 钟山县| 镇康县| 黄浦区| 铜梁县| 青铜峡市| 德格县| 桃园县| 临颍县| 镇赉县| 哈密市| 启东市| 渝中区| 南城县| 怀宁县| 绩溪县| 建宁县| 海安县| 鹿泉市| 墨脱县| 凤台县| 红桥区| 八宿县| 长白| 林甸县| 青田县| 舒兰市| 化隆| 习水县| 南华县| 陕西省| 五家渠市| 内丘县| 金昌市| 斗六市| 喀什市| 磐安县|