react-15-懒加载思路及简易实现

简介: 1.1 懒加载现在基本也是主流的基本功了,用的太多了1.2 第三方库也非常多,但是我们还需要了解原理滴1.3 基于上篇文章商城列表1.4 来一起玩玩吧

1.前言


1.1 懒加载现在基本也是主流的基本功了,用的太多了

1.2 第三方库也非常多,但是我们还需要了解原理滴

1.3 基于上篇文章商城列表

1.4 来一起玩玩吧


2. 效果


$TB~3YBHHCE`)P[Z7)MDU(H.png



3. 分析


  1. 首先上篇文章是用函数式组件写的,这篇文章需要用到生命周期钩子,所以选用类组件
  2. 函数式组件和类组件的区别,导致一些写法上的不同 比如传值
  3. 懒加载代码的书写位置
    3.1 懒加载是监听的的图片滚动事件
    3.2 所以图片在哪,监听在哪
    3.3 图片比较多,所以懒加载直接封装成组件
  4. 一个懒加载组件 LazyImg
    只负责图片相关
  5. 一个Item组件 就是li列表具体内容
    包含 LazyImg和标题
  6. 一个整合组件 App  就是ul
    用来遍历操作 具体的 Item
  7. 具体细节 ,先干起来
    分析不动了,就实干


4.懒加载组件  LazyImg


懒加载是单独处理图片的

图片URL往下传

构造函数和渲染函数都比较简单

麻烦的是钩子 ,懒加载逻辑

4.1 基础结构

这里用了 ref来获取具体的懒加载标签


class LazyImg extends React.Component {
            constructor() {
                super()
                console.log("懒加载-构造函数")
            }
            render() {
                return (
                    <img ref="img" alt="" />
                )
            }
            componentDidMount() {}
}


4.2 具体逻辑

都是在钩子里面写的

  1. 通过ref获取需要拦截的标签
  2. 懒加载嘛,自然需要设置一个等待的loading图片
  3. 懒加载具体的逻辑封装成一个函数,因为这个懒加载是在监听函数里面执行的,代码太多,维护起来不方便,看着也不够简介

4.3 懒加载核心分析-监听时机-啥时候启动懒加载代码

  1. 获取已经滚动的高度,也俗称卷起来的高度 scrollTopHeight
  2. 窗口的高度  windowHeight
  3. 图片距离顶部的距离 imgTopHeight
7.看图分析

6{WMFNZWU21@RLMP0]0`6EH.png


  1. 图片距离顶部的距离+一个数值 < 滚动高度+窗口的高度
    这个数值 自己可以试验,看到多少的时候,进行图片切换不显示懒加载,显示正常的图片,
    比方说你想在图片 显示1/3时,就看见图片,那你的这个数值就写图片的1/3
    抱歉 语文学的不好,老师教的好,但是自己表达能力不行


imgTopHeight + 变量< scrollTopHeight + windowHeight)


  1. 在这个条件成立时切换图片
  2. 监听函数


5. 懒加载逻辑实现


说了那么多废话,上代码

不过我觉得上面的废话-逻辑梳理比这个代码本身重要的多


componentDidMount() {
                // console.log(dataList.length);
                // 设置Loading动画
                var img = this.refs.img
                img.style.background = "url(../img/lazyload.gif) center center no-repeat"
                var ld = () => {
                    var scrollTopHeight = document.body.scrollTop || document.documentElement.scrollTop
                    var windowHeight = window.innerHeight
                    var imgTopHeight = img.offsetTop;
                    if (imgTopHeight + 150 < scrollTopHeight + windowHeight) {
                        img.src = this.props.src
                        img.onload = () => {
                            img.style.background = "none"
                        }
                        //  取消滚动监听
                        window.removeEventListener("scroll", ld)
                    }
                }
                ld()
                window.addEventListener("scroll", ld)
            }



6. Item组件


这个逻辑就简单了 就是传值

不过这个注意和函数式组件的区分 ,写上this


class Item extends React.Component {
            constructor() {
                super();
            }
            //获取属性   添加this  
            render() {
                return (<li>
                    <LazyImg src={this.props.item.image} />
                    <h6>{this.props.item.name}</h6>
                </li>
                )
            }
        }



7. 整合组件


这里面的数据 也是之前node爬虫爬取的,一个js文件

通过setTimeOut模拟了一个ajax请求数据

循环的key值 不要忘写


class App extends React.Component {
            constructor() {
                super();
                this.state = {
                    dataList: []
                }
            }
            render() {
                return (<ul className="list">
                    {
                        this.state.dataList.map(item => {
                            return (
                                <Item item={item} key={item.skuId} />
                            )
                        })
                    }
                </ul>)
            }
            componentWillMount() {
                // 模拟ajax请求
                setTimeout(() => {
                    this.setState({
                        dataList: dataList
                    })
                }, 2000)
            }
        }



8. 还是简写说下数据结构


8.1 数据引入


<script src="../js/data.js"></script>


8.2 数据格式


var dataList = [{},{}]



9. 后记?


打完收工,不知道写啥了 吃饭去 哈哈




相关文章
|
8月前
|
前端开发 JavaScript
React和Vue实现路由懒加载
React和Vue实现路由懒加载
95 2
|
4月前
|
前端开发 JavaScript
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
本文介绍了在React项目中实现路由懒加载的方法,使用React提供的`lazy`和`Suspense`来优化项目首次加载的速度。通过将路由组件改为懒加载的方式,可以显著减少初始包的大小,从而加快首次加载速度。文章还展示了如何使用`Suspense`组件包裹`Switch`来实现懒加载过程中的fallback效果,并提供了使用前后的加载时间对比,说明了懒加载对性能的提升作用。
320 2
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
|
2月前
|
前端开发 API UED
React 懒加载图片 Lazy Image
懒加载是一种优化技术,通过延迟加载不在视口内的图片,减少初始页面加载时间,提升用户体验。本文从基础概念入手,逐步探讨 React 中实现图片懒加载的常见问题、易错点及解决方案,并通过代码案例详细解释。
76 3
|
3月前
|
缓存 前端开发 UED
React Suspense 懒加载详解
【10月更文挑战第18天】React Suspense 是 React 16.6 引入的新特性,主要用于处理异步数据获取和组件懒加载。本文从 Suspense 的基本概念出发,介绍了其在代码分割和数据获取中的应用,通过具体代码示例展示了如何使用 `React.lazy` 和 `Suspense` 实现组件的懒加载,并探讨了实践中常见的问题及解决方法,帮助开发者提升应用性能和用户体验。
154 1
|
5月前
|
开发者 搜索推荐 Java
超越传统:JSF自定义标签库如何成为现代Web开发的个性化引擎
【8月更文挑战第31天】JavaServer Faces(JSF)框架支持通过自定义标签库扩展其内置组件,以满足特定业务需求。这涉及创建`.taglib`文件定义标签库及组件,并实现对应的Java类与渲染器。本文介绍如何构建和应用JSF自定义标签库,包括定义标签库、实现标签类与渲染器逻辑,以及在JSF页面中使用这些自定义标签,从而提升代码复用性和可维护性,助力开发更复杂且个性化的Web应用。
84 0
|
5月前
|
前端开发 测试技术 UED
React性能优化的神奇之处:如何用懒加载与代码分割让你的项目一鸣惊人?
【8月更文挑战第31天】在现代Web开发中,性能优化至关重要。本文探讨了React中的懒加载与代码分割技术,通过示例展示了如何在实际项目中应用这些技术。懒加载能够延迟加载组件,提高页面加载速度;代码分割则将应用程序代码分割成多个块,按需加载。两者结合使用,可以显著提升用户体验。遵循合理使用懒加载、编写测试及关注性能等最佳实践,能够更高效地进行性能优化,提升应用程序的整体表现。随着React生态的发展,懒加载与代码分割技术将在未来Web开发中发挥更大作用。
60 0
|
8月前
|
前端开发 UED 开发者
react路由懒加载lazy直接使用组件标签引发的问题?
react路由懒加载lazy直接使用组件标签引发的问题?
535 0
|
8月前
|
前端开发
react 实现图片懒加载
react 实现图片懒加载
166 0
|
8月前
|
前端开发
20行代码,封装一个 React 图片懒加载组件
20行代码,封装一个 React 图片懒加载组件
|
前端开发 UED
react中懒加载实现原理
react中懒加载实现原理
220 0