美文网首页
vue3中的数据懒加载

vue3中的数据懒加载

作者: 缺月楼 | 来源:发表于2022-10-16 19:01 被阅读0次
实现当组件进入可视区域在加载数据。

使用 @vueuse/core中的 useIntersectionObserver来实现监听进入可视区域行为.

vueuse它是为Vue 2和Vue 3服务的一套Vue Composition API的常用工具集,是目前世界上Star最高的同类型库之一。它的初衷就是将一切原本并不支持响应式的JS API变得支持响应式,省去程序员自己写相关代码。
具体实践如下

// 提供复用逻辑的函数(钩子)  数据懒加载

import { useIntersectionObserver } from '@vueuse/core'
import { ref } from 'vue'
/**
 * 数据懒加载函数
 * @param {object} target  --DOM对象
 * @param {function} apiFn ---API函数
 *
 */
export const useLazyData = (apiFn) => {
  const result = ref([])
  const target = ref(null)
  // stop停止观察
  const { stop } = useIntersectionObserver(
    // 监听目标元素
    // target 是观察的目标dom容器,必须是dom容器,而且是vue3.0方式绑定的dom对象
    target,
    // isIntersecting 是否进入可视区域,true是进入 false是移出
    // observerElement 被观察的dom
    ([{ isIntersecting }], observerElement) => {
      // 在此处可根据isIntersecting来判断,然后做业务
      if (isIntersecting) {
        // console.log('进入可是去')
        stop()
        // 调用API 函数获取数据
        apiFn().then(data => {
          result.value = data.result
        })
      }
    }
  )
  return { result, target }
}

二 :在组件中引入 看注释

<template>
  <div class='home-new'>
    <HomePanel title="新鲜好物" sub-title="新鲜出炉 品质靠谱 ">
        <template #right>
            <XtxMore path="/" />
        </template>
  <!-- 引入 target去绑定一个监听对象 最好是DOM -->
       <div ref="target" style="position:relative;height:426px;">
        <!-- 面板内容 -->
        <!-- 动画效果 -->
        <Transition name="fade">
            <ul v-if="goods.length" class="goods-list">
                <li v-for="item in goods" :key="item.id">
                    <RouterLink :to="`/product/${item.id}`">
                        <img :src="item.picture" alt="">
                        <p class="name ellipsis">{{item.name}}</p>
                        <p class="price">&yen;{{item.price}}</p>
                    </RouterLink>
                </li>
            </ul>
            <!-- 骨架效果  -->
            <HomeSkeleton bg="#f0f9f4" v-else />
        </Transition>
       </div>
    </HomePanel>
  </div>
</template>

<script>
import HomePanel from './home-panel.vue'
import HomeSkeleton from './home-skeleton.vue'
import { findNew } from '@/api/home'
import { useLazyData } from '@/hooks'
export default {
  name: 'HomeNew',
  components: {
    HomePanel,
    HomeSkeleton
  },
  setup () {
  //普通加载 
    // const goods = ref([])
    // findNew().then(data => {
    //   goods.value = data.result
    // })
    // 数据懒加载
    // const target = ref(null)
    // 1.target去绑定一个监听对象 最好是DOM
    // 2.传入API函数 内部获取调用 返回的就是响应式数据
    const { target, result } = useLazyData(findNew)

    return { goods: result, target }
  }
}
</script>
<style scoped lang='less'>
.goods-list {
            display: flex;
            justify-content: space-between;
            height: 406px;

            li {
                width: 306px;
                height: 406px;
                background: #f0f9f4;
                .hoverShadow();

                img {
                    width: 306px;
                    height: 306px;
                }

                p {
                    font-size: 22px;
                    padding: 12px 30px 0 30px;
                    text-align: center;
                }

                .price {
                    color: @priceColor;
                }
            }
        }
</style>

相关文章

  • vue3中的数据懒加载

    实现当组件进入可视区域在加载数据。 使用 @vueuse/core中的 useIntersectionObserv...

  • 数据懒加载(Vue3)

    导入资源 useIntersectionObserver函数 我们可以使用 `@vueuse/core` 中的 `...

  • Vue2与Vue3区别

    1、 组件的懒加载 1.1 Vue2实现 1.2 Vue3实现

  • fragment 懒加载

    fragment 的懒加载 懒加载 什么是懒加载:只有在 fragment 显示在界面的时候,才进行数据的加载 懒...

  • 懒加载

    项目中有时候有些数据,特别是数据比较多的时候,这时候可以不要写在viewdidload中 可以用懒加载加载数据,懒...

  • Webpack高级配置「五」-- 懒加载 & 处理JSX & 处

    1.懒加载 abc.js 文件中定义数据: 动态引入数据 - 实现懒加载: 最后产出一个独立的js,等同于定义一个...

  • 项目优化

    图片懒加载,数据懒加载, 路由懒加载 1.图片懒加载原理 1.1 开始时 不设置src属性 1.2 图片在可视区域...

  • Swift语法点

    1 懒加载 懒加载与OC中的懒加载的区别:懒加载的类一旦 设置为nil 后, 懒加载就不会再次执行,与OC中不同,...

  • ios 自定义cell,自定义行高,自适应行高

    定义数据模型model,tableviewcontroller中懒加载model,重写get方法,获取数据。将模型...

  • SwiftUI 中的List 在MacOS 中的性能优化。

    List在iOS中有懒加载的特性,但是在MacOS中会一次性加载完List中的所有的数据。并没有懒加载的特性。 所...

网友评论

      本文标题:vue3中的数据懒加载

      本文链接:https://www.haomeiwen.com/subject/udwlzrtx.html