美文网首页
vue多个相同组件懒加载数据

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

作者: 想做个文人 | 来源:发表于2019-10-31 21:23 被阅读0次

项目中遇到一个需求,页面中有很多个商品组件,但是商品的数据是通过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。

相关文章

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

    项目中遇到一个需求,页面中有很多个商品组件,但是商品的数据是通过json给到的静态数据,需要调用另外的商品json...

  • Vue EventBus踩坑总结

    前提: vue 组件懒加载 ()=>import()这种方式引入组件 首次加载不触发,A组件emit,B组件on,...

  • vue中组件懒加载

    vue中组件懒加载的方法 1.异步实现路由懒加载 2.import(推荐使用这种方式) 同理,路由懒加载和组件懒加...

  • Vue路由异步组件

    vue异步组件和懒加载可以优化vue的性能 一、 原理 利用webpack对代码进行分割是懒加载的前提,懒加载就是...

  • vue树形单选表单

    组件 tree-lazy.vue 包括懒加载

  • vue路由懒加载及组件懒加载

    路由 和 组件 的常用两种懒加载方式:1、vue异步组件实现路由懒加载component:resolve=>(['...

  • 2019-05-10

    vue 组件按需引用,vue-router懒加载,vue打包优化,加载动画 当打包构建应用时,Javascript...

  • vue路由懒加载和组件懒加载

    vue路由懒加载及组件懒加载 一、为什么要使用路由懒加载 为给客户更好的客户体验,首屏组件加载速度更快一些,解决白...

  • Vue路由懒加载

    VUE路由懒加载及组件懒加载一、为什么要使用路由懒加载为给客户更好的客户体验,首屏组件加载速度更快一些,解决白屏问...

  • 浅谈 vue项目优化

    1.路由懒加载 使用vue-router的方法 2.图片懒加载 组件缓存 使用vue的,详...

网友评论

      本文标题:vue多个相同组件懒加载数据

      本文链接:https://www.haomeiwen.com/subject/smuwvctx.html