懒加载(指的就是,当用户通过滚动条,滚动到哪,哪的结构,才开始发ajax,拿数据,渲染)都是这个前提
如何确定滚动到哪()
如何使用可以在vue.use网站上搜索useIntersectionObserver
首先npm i @vueuse/core
然后创建一个js文件import { useIntersectionObserver } from '@vueuse/core'import { ref } from 'vue'export const useLazyData = (fn) => {const target = ref(null)const { stop } = useIntersectionObserver(target, ([{ isIntersecting }], observerElement) => {if (isIntersecting) {这个if判断的就是isIntersecting为true,就是滚动到了约定好的位置开始执行下一步,里面的发ajax了//停止stop监控,这样,就能确保只有第一次的时候,滑动到图片的时候发ajax,下一次滑动到这个图片的时候就不发ajax了,因为第一次已经发ajax获取到了数据stop()//是一个形参也就是发ajax的函数fn()}},{ // 元素进入可见区域的比值(0-1)指的是滑动到这个元素的啥比例,就开始执行上面的代码操作(图片懒加载就是滑动到当前这个图片这,在发ajax)这个也是起决定性的作用的 threshold:0 表示刚滚动到这个元素那就发ajax获取数据(范围是0-1)threshold: 0})return target}
使用定义好的useLazyData这个函数在页面中
import { useLazyData } from '@/compositions'export default {name: 'HomeSpecial',components: { HomePanel },setup () {const list = ref([])//这里的fn就是发ajax请求数据的函数(效果也就是到滚动到这个id为target的元素的时候,在发ajax获取数据,起到了懒加载的效果)const fn = () => {findSpecial().then(data => {console.log(data, '000000000')list.value = data.result})}const target = useLazyData(fn)return { list, target }}这个target的重要性,就是只要用了这个懒加载的函数 渲染这个ajax数据的模板的根元素就得设置一个ref等于这个target,才能渲染上去,看下图
<HomePanel title="最新专题" ref="target"><template v-slot:right><XtxMore /></template><div class="special-list" ref="homeSpecial" v-if="list.length"><div class="special-item" v-for="item in list" :key="item.id"><RouterLink to="/"><img :src="item.detailsUrl" alt /><div class="meta"><p class="title"><span class="top ellipsis">{{item.title}}</span><span class="sub ellipsis">{{item.summary}}</span></p><span class="price">¥{{item.lowestPrice}}起</span></div></RouterLink><div class="foot"><span class="like"><i class="iconfont icon-hart1"></i>100</span><span class="view"><i class="iconfont icon-see"></i>100</span><span class="reply"><i class="iconfont icon-message"></i>100</span></div></div></div><div v-else><XtxSkeleton v-for="i in 3" :key="i" width="404px" height="288px" bg='#ccc'/></div></HomePanel>
图片懒加载优化
