vue多个相同组件懒加载数据

项目中遇到一个需求,页面中有很多个商品组件,但是商品的数据是通过json给到的静态数据,需要调用另外的商品json去更新以前给到的静态的数据,并且在该商品滑动到界面的时候才去更新,如果商品是下架的状态,商品隐藏不展示。

需求分析

  • 如何做到数据懒加载?
    页面挂载后,所有的子组件都会进入mounted生命周期,那如何判断这个组件已经滑动到可视窗口了呢?
    这里用到vue的$refs属性来获取当前的组件,然后找到当前页面滚动的元素,监听滚动,判断当前的组件是否已经出现在可视窗口就可以了。

实现

// product-item.vue
<template>
    <div ref="productDom" v-if="showProductComp">{{data}}</div>
</template>
<script>
    import {inViewport, fetchProduct} from 'utils'
    export default{
        data() {
            showProductComp: true, // 组件默认挂载商品都是显示的
        },
        props: {...item}, // 传入组件的商品静态信息
        mounted() {
           let vm = this;      
           let dom = this.$refs.productDom;
           let flag = dom && inViewport(dom); // 判断组件dom是否在可视窗口内
           if(flag){
            this.fetchProductFn()
          }else{
            let scroll = getScrollview(dom);
            scroll.addEventListener('scroll', this.fetchProductFn);
          }
        },
        methods: {
            fetchProductFn() {
                let dom = this.$refs.productDom;
                let flag = dom && inViewport(dom);
                if (!flag) {
                    scroll.removeEventListener('scroll', this.fetchProductFn)
                    return
                }
                fetchProduct(this.item.code).then(data => { // 通过请求json获取的商品信息更新商品
                      let itemData = {...this.item, ...data}
                      this.item = Object.assign(this.item, itemData);
                      this.showProductComp = this.productListing(this.item); // 判断商品是否是上架状态,如果下架就隐藏该商品
                })
            }
        }
    }
</script>
image.png

总结

原先做法通过获取商品组件的外层class来获取dom判断是否在可视窗口内,后来发现判断的始终是第一个挂载的商品,所以页面一挂载,所有的json都加载出来了;后来想着vue.$ref能获取到组件中的dom,所以能够判断当前的组件中的元素是否在可视范围内,如果在,就去加载json文件,然后判断当前的商品是否是下架的,如果是下架的再通过v-if删掉当前的组件dom。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 忽然发现 每一件事情发生了 它可以是地狱 也可以是天堂 就看你 如何想
    风舞苍穹阅读 106评论 0 1
  • 慧语禅心:伤害别人 最大的受害者是自己 人与人的相遇是用几世修来的,相识即是有缘。所以,凡事不必斤斤计较,退一步海...
    xcy无名阅读 337评论 0 0