数据懒加载(vueuse):

实现当组件进入可视区域再加载数据。

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

步骤:

*
理解 useIntersectionObserver 的使用,各个参数的含义

*
掌握 useIntersectionObserver 函数的用法

*
封装 useLazyData 函数,作为数据懒加载公用函数

分析下这个useIntersectionObserver 函数:
// stop 是停止观察是否进入或移出可视区域的行为     const { stop } = useIntersectionObserver(  //
target 是观察的目标dom容器,必须是dom容器,而且是vue3.0方式绑定的dom对象  target,  // isIntersecting
是否进入可视区域,true是进入 false是移出  // observerElement 被观察的dom ([{ isIntersecting }],
observerElement) => {    // 在此处可根据isIntersecting来判断,然后做业务 }, )
封装一个钩子函数:
// hooks 封装逻辑,提供响应式数据。 import { useIntersectionObserver } from '@vueuse/core'
import { ref } from 'vue' ​ /** * 数据懒加载函数 * @param {Element} target -Dom对象 监听对象
* @param {Function} apiFn -API函数 监听完发请求拿数据 */ // 数据懒加载函数 export const
useLazyData = (target, apiFn) => {    const result = ref([])    // stop 停止观察  
 const { stop } = useIntersectionObserver(        // 监听的目标元素        target,    
  ([{ isIntersecting }], observerElement) => {            // isIntersecting
是否进入可视区            if (isIntersecting) {                stop()              
 // 调用传进来的api函数 获取数据                apiFn().then(data => {                  
 result.value = data.result               })           }       },        //
threshold: 0   只要dom盒子与可视区相交就触发加载数据       {            threshold: 0.05       }
  )    //得到数据 将来直接使用就行了    return result }
使用:
<!-- 当div进入可视区 数据开始加载--> <template> <div ref="target">     <li v-for="item in
goods" :key="item.id">   ....   </li>    </div> </template> <script> //导入
import { useLazyData } from "@/hooks"; export default { setup() {    //没有数据懒加载时
   // const goods = ref([]);    // findNew().then((data) => {    //  
goods.value = data.result;    // });          //数据懒加载时    // 数据将来不知道是什么类型
ref(null)    // 使用方法:    // 1.target 去绑定一个监听对象,最好是DOM    //
2.传入API函数,内部获取调用,返回的就是响应式数据    const target = ref(null)    const reslut  =
useLazyData(target,findNew);    return { goods: reslut, target }; } } </script>

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信