原理:实现当组件进入可视区域在加载数据
初始页面发的请求滑动到新鲜好物是时触发new请求
1.由于首页面板数据加载都需要实现懒数据加载,所以封装一个钩子函数,得到数据
src/hook/index.js
// 封装一个通用的方法实现数据的懒加载
import { useIntersectionObserver } from '@vueuse/core'
import { ref } from 'vue'
export const useLazyData = (apiFn) => {
// target表示组件的最外层div元素
const target = ref(null)
// 懒加载接口返回的数据
const result = ref([])
// 监听组件是否进入可视区
const { stop } = useIntersectionObserver(target, ([{ isIntersecting }]) => {
// 如果target对应的DOM进入可视区,那么该回调函数就触发
if (isIntersecting) {
// 被监听的DOM进入了可视区:此时调用接口获取数据;停止继续监听
stop()
apiFn().then(data => {
result.value = data.result
})
}
})
// result表示接口懒加载获取的业务数据
// target表示被监听的DOM元素,需要在模板中被ref属性绑定
return { result, target }
}
2.使用组件
<HomePanel title="人气推荐" sub-title="人气爆款 不容错过" ref='target'>
import { findHot } from '@/api/home'
import HomePanel from './home-panel'
import HomeSkeleton from './home-skeleton'
+import { useLazyData } from '@/hooks'
export default {
name: 'HomeHot',
components: { HomePanel, HomeSkeleton },
setup () {
+ const { target, result: goods } = useLazyData(findHot)
+ return { target, goods }
}
}