React懒加载组件实现

懒加载的好处

当我们一次性大批量的加载资源的时候,会占用大量的内存,尤其是在一些低内存的设备上会造成卡顿的现象,所以我们就需要在必要的时候再进行资源的加载。

懒加载就是在真正需要资源才加载资源,这样就可以节省内存,尽可能的减少卡顿现象的出现。

懒加载原理

懒加载的原理就如上图所示,当组件进入可视区域加载子组件,不在可视区域内卸载子组件。懒加载的原理就是这么简单,下面介绍一下懒加载具体的实现方法。

1. 计算子组件是否在可视区域之内

const checkVisible = (component,offset=100,parent) => {   //获取实际的DOM
    const node = ReactDOM.findDOMNode(component)   //获取距离顶部的距离
    const {top} = node.getBoundingClientRect()
    const windowHeight = window.innerHeight || document.documentElement.clientHeight
    const {top:parentTop,bottom:parentBottom } = parent.getBoundingClientRect()   //可视区域顶部的位置
    const finalTop = Math.max(parentTop,0)   //可视区域底部的位置
    const finalBottom = Math.min(parentBottom,windowHeight)   //计算是否在可视区域之内
    if(top > finalTop - 100 && top < finalBottom + 100){
        return true
    }
    return false
}

2. 添加滚动事件

首先我们先利用上面的函数检查检查子组件是否在可视区域内,如果是则设置isVisible为true,则显示组件,否则不显示组件。

checkedVisible(parent){     //是否只懒加载一次,once为true 加载之后不再操作dom
        const once = this.props.once ;
        const offset = this.props.offset
        return throttle(()=>{
            const visibleState = this.state.isVisible
            if(!(once && visibleState)){
                const isVisible = checkVisible(this,offset,parent)
                this.setState({isVisible})
            }
        },200)
    }
const parent = getScrollParent(node);
const checkedVisibleFn = this.checkedVisible(parent) ;
//添加滚动事件
window.addEventListener("scroll",checkedVisibleFn,false)

为window对象添加滚动事件,为防止滚动事件频繁触发checkedVisible,我们为检查checkVisible函数节流,减少性能开销。此处我们利用的throttle函数,更多关于节流函数和函数去抖的介绍可参考这边博客:JS魔法堂:函数节流(throttle)与函数去抖(debounce)

3. 获取可滚动的父组件

当前我们只是为考虑了window对象可滚动的情况,如果是DOM对象可滚动我们就需要获取可滚动的父对象,而不只是仅仅window对象。

//获取滚动的父元素
const getScrollParent = (node) => {
    if(!node){
        return document.documentElement
    }

    let parent = node ;
    //正则
    const overflowReg = /(scroll|auto)/
    while(parent){
        if(!parent.parentNode){
            return document.documentElement
        }
        const {overflow} = window.getComputedStyle(parent)
        if(overflowReg.test(overflow)){
            return parent
        }
        parent = parent.parentNode
    }
    return document.documentElement
}

export default getScrollParent

4. 再次添加滚动事件

如果不仅仅是window可滚动我们在添加滚动事件之前进行一次判断。

const node = ReactDOM.findDOMNode(this) ;
const parent = getScrollParent(node);
const checkedVisibleFn = this.checkedVisible(parent) ;

 if(parent === document.documentElement){
       window.addEventListener("scroll",checkedVisibleFn,false)
 }else{
       parent.addEventListener("scroll",checkedVisibleFn,false)
 }  

总结

以上基本就是react懒加载基本实现的方法,具体的代码以及demo,可以参考源码:https://github.com/volcanoliuc/react-lazyload-demo

此demo仅仅只是简化版的react懒加载,如果是在实际的项目中需要使用推荐使用 react-lazyload

原文地址:https://www.cnblogs.com/voll/p/8431751.html

时间: 2024-10-30 06:13:17

React懒加载组件实现的相关文章

React 懒加载组件

//组件第一次初始化的时候加载. import React, {PropTypes} from 'react'; //import AppComposer from './views/App/AppComposer'; //import LoginComposer from './views/Login/LoginComposer'; //import HomeComposer from './views/Home/HomeComposer'; //import WatchListCompose

jQuery.imgLazyLoad图片懒加载组件

一.前言 当一个页面中请求的图片过多,而且图片太大,页面访问的速度是非常慢的,对用户的体验非常不友好:使用图片懒加载,可以减轻服务器的压力,增加页面的访问量,这里主要是总结一下我自己写的图片懒加载组件jQuery.imgLazyLoad:使用该组件应在img标签中设置一个imglazyload-src属性,存放图片地址. 二.应用实例demo /** * component: imgLazyLoad 2013/12/12 华子yjh * invoking: jQuery.imgLazyLoad(

深入懒加载

[javascript] view plain copy 懒加载(LazyLoad)一直是前端的优化方案之一.它的核心思想是:当用户想看页面某个区域时,再加载该区域的数据.这在一定程度上减轻了服务器端的压力,也加快了页面的呈现速度. 懒加载多用于图片,因为它属于流量的大头.最典型的懒加载实现方案是先将需要懒加载的图片的src隐藏掉,这样图片就不会下载,然后在图片需要呈现给用户时再加上src属性. 公司内部库的懒加载正是采用这种方案.它会遍历页面中所有的图片,将其src缓存起来后删除图片的src属

vue按需加载组件-webpack require.ensure

使用 vue-cli构建的项目,在 默认情况下 ,执行 npm run build 会将所有的js代码打包为一个整体, 打包位置是 dist/static/js/app.[contenthash].js 类似下面的路由代码 router/index.js 路由相关信息,该路由文件引入了多个 .vue组件 import Hello from '@/components/Hello'import Province from '@/components/Province'import Segment

vue 组件按需引用,vue-router懒加载,vue打包优化,加载动画

当打包构建应用时,Javascript 包会变得非常大,影响页面加载.如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了. 结合 Vue 的 异步组件 和 Webpack 的 code splitting feature, 轻松实现路由组件的懒加载. 我们要做的就是把路由对应的组件定义成异步组件 const Foo = resolve => { // require.ensure 是 Webpack 的特殊语法,用来设置 code-split

Ionic3 组件懒加载

使用懒加载能够减少程序启动时间,减少打包后的体积,而且可以很方便的使用路由的功能. 使用懒加载: 右侧红色区域可以省略掉(引用.声明也删掉) 若使用ionic命令新建page,则无需进行下面的操作,否则进行下面的操作: 新建文件:home.module.ts import { NgModule } from '@angular/core';import { IonicPageModule } from 'ionic-angular';import { LoginPage } from './lo

在懒加载的Ionic工程中使用 ionic2-auto-complete 组件:Can&#39;t bind to &#39;dataProvider&#39; since it isn&#39;t a known property of &#39;ion-auto-complete&#39;

问题描述: 在基于懒加载的Ionic工程中,使用ionic2-auto-complete组件(GitHub地址:https://github.com/kadoshms/ionic2-autocomplete),出现以下错误提示: 说明:组件使用均是按照GitHub上的标准写法, 在非懒加载的Ionic工程中可以正常使用(可以参看我另外一篇博客:http://www.cnblogs.com/crazyprogrammer/p/6925199.html), 但是工程在改造成懒加载模式后,会出现上述错

vue组件懒加载(Load On Demand)

在Web应用程序中,系统的瓶颈常在于系统的响应速度.如果系统响应速度过慢,用户就会出现埋怨情绪,系统的价值也因此会大打折扣.因此,提高系统响应速度,是非常重要的. 懒加载(Load On Demand)是一种独特而又强大的数据获取方法,它能够在用户滚动页面的时候自动获取更多的数据,而新得到的数据不会影响原有数据的显示,同时最大程度上减少服务器端的资源耗用. 用vue.js写单页面应用时,会出现打包后的JavaScript包非常大,影响页面加载,我们可以利用路由的懒加载去优化这个问题,当我们用到某

Angular23 loading组件、路由配置、子路由配置、路由懒加载配置

1 需求 由于Angular是单页面的应用,所以在进行数据刷新是进行的局部刷新:在进行数据刷新时从浏览器发出请求到后台响应数据是有时间延迟的,所以在这段时间就需要进行遮罩处理来提示用户系统正在请求数据. 2 loading组件简介 loading组件就是专门负责遮罩处理的,可以自定一个loading组件,也可以使用别人创建号的loading模块:loading组件生效后的效果如下: 参考资料:点击前往 3 编程步骤 3.1 创建一个angular项目 技巧01:版本必须是angular4及以上