数据懒加载(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>