react和vue图片懒加载及实现原理

一、实现原理

  1. 核心思想

    • 只有当图片出现在视口中时,才加载图片。
    • 利用占位图或占位背景优化用户体验。
  2. 实现技术

    • 监听滚动事件:监听页面滚动,通过计算图片与视口的位置关系,判断是否需要加载图片。
    • Intersection Observer(推荐):现代浏览器提供的 API,用于检测目标元素是否进入视口,比滚动事件性能更好。
  3. 步骤

    • 设置图片的占位符(如灰色背景、默认图片)。
    • 检测图片元素是否进入视口。
    • 当图片进入视口时,将 src 属性替换为实际图片地址。

二、React 实现图片懒加载

1. 使用 Intersection Observer 实现

.

import React, { useRef, useState, useEffect } from 'react';

const LazyImage = ({ src, alt, placeholder, className }) => {
  const [isLoaded, setIsLoaded] = useState(false);
  const imgRef = useRef();

  useEffect(() => {
    const observer = new IntersectionObserver(
      ([entry]) => {
        if (entry.isIntersecting) {
          setIsLoaded(true);
          observer.disconnect(); // 图片加载后停止观察
        }
      },
      { threshold: 0.1 } // 10% 进入视口时触发
    );

    if (imgRef.current) {
      observer.observe(imgRef.current);
    }

    return () => {
      if (observer && imgRef.current) {
        observer.unobserve(imgRef.current);
      }
    };
  }, []);

  return (
    <img
      ref={imgRef}
      src={isLoaded ? src : placeholder}
      alt={alt}
      className={className}
    />
  );
};

export default LazyImage;
2. 第三方库
  • react-lazyload:轻量级懒加载库,支持图片、组件等。
npm install react-lazyload
import React from 'react';
import LazyLoad from 'react-lazyload';

const LazyImage = ({ src, alt, height }) => (
  <LazyLoad height={height} offset={100}>
    <img src={src} alt={alt} />
  </LazyLoad>
);

export default LazyImage;

三、Vue 实现图片懒加载

1. 使用 Intersection Observer
<template>
  <img
    :src="isLoaded ? src : placeholder"
    :alt="alt"
    ref="imageRef"
    class="lazy-image"
  />
</template>

<script>
export default {
  props: {
    src: String,
    placeholder: String,
    alt: String,
  },
  data() {
    return {
      isLoaded: false,
    };
  },
  mounted() {
    const observer = new IntersectionObserver(
      ([entry]) => {
        if (entry.isIntersecting) {
          this.isLoaded = true;
          observer.disconnect();
        }
      },
      { threshold: 0.1 }
    );

    observer.observe(this.$refs.imageRef);
  },
};
</script>
2. 使用指令(全局注册)

懒加载在 Vue 中可通过自定义指令实现:

// directive-lazyload.js
export const lazyload = {
  mounted(el, binding) {
    const loadImage = () => {
      const imageElement = el;
      if (imageElement) {
        imageElement.src = binding.value;
      }
    };

    const observer = new IntersectionObserver(([entry]) => {
      if (entry.isIntersecting) {
        loadImage();
        observer.disconnect();
      }
    });

    observer.observe(el);
  },
};

注册全局指令:

import { lazyload } from './directive-lazyload';
const app = createApp(App);
app.directive('lazyload', lazyload);

使用

<template>
  <img v-lazyload="imageSrc" alt="Lazy loaded image" />
</template>

<script>
export default {
  data() {
    return {
      imageSrc: 'https://example.com/image.jpg',
    };
  },
};
</script>
3. 第三方库
  • vue-lazyload
npm install vue-lazyload
import VueLazyload from 'vue-lazyload';
app.use(VueLazyload, {
  loading: 'path/to/loading-image.png', // 占位图
  error: 'path/to/error-image.png',   // 错误图
});

<template>
  <img v-lazy="imageSrc" alt="Lazy loaded image" />
</template>

四、性能优化与注意事项

  1. 减少主线程开销:优先使用 Intersection Observer,避免滚动事件监听。
  2. 设置占位图:使用占位图片或颜色,避免加载空白区域影响体验。
  3. 图片格式优化
    • 使用 WebP 等高压缩比格式。
    • 根据设备和网络情况选择适配图片(如 srcsetpicture 标签)。
  4. 懒加载阈值:通过设置 offsetthreshold 提前加载,提高滚动时的视觉连续性。
  5. 服务器优化:开启图片的 lazy 属性,结合懒加载策略。

通过上述方法,React 和 Vue 都可以灵活实现高性能的图片懒加载功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/921510.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

I.MX6U 裸机开发18.GPT定时器实现高精度延时

I.MX6U 裸机开发18.GPT定时器实现高精度延时 一、GPT定时器简介1. GPT 功能2. 时钟源3. 框图4. 运行模式&#xff08;1&#xff09;Restart mode&#xff08;2&#xff09;Free-Run Mode 5. 中断类型&#xff08;1&#xff09;溢出中断 Rollover Interrupt&#xff08;2&#x…

亚马逊IP关联是什么?我们该怎么解决呢?

亚马逊不仅提供了广泛的商品和服务&#xff0c;也是许多企业和个人选择的电子商务平台。然而&#xff0c;与亚马逊相关的IP关联问题&#xff0c;特别是在网络安全和运营管理方面&#xff0c;经常成为使用亚马逊服务的用户和商家关注的焦点。通过了解亚马逊IP关联的含义、可能的…

摄影:相机控色

摄影&#xff1a;相机控色 白平衡&#xff08;White Balance&#xff09;白平衡的作用&#xff1a; 白平衡的使用环境色温下相机色温下总结 白平衡偏移与包围白平衡包围 影调 白平衡&#xff08;White Balance&#xff09; 人眼看到的白色&#xff1a;会自动适应环境光线。 相…

Python模块、迭代器与正则表达式day10

1、Python模块 1.1模块的简介 在编写代码的时候&#xff0c;创建的.py文件就被称为一个模块 1.2模块的使用 想要在a文件里使用b文件的时候&#xff0c;只要在a文件中使用关键字import导入即可 1.2.2 from ...import...语句 导入模块可以使用import&#xff0c;如果只导入模…

鸿蒙系统下使用AVPlay播放视频,封装播放器

鸿蒙系统下使用AVPlay开发一款视频播放器流程 一. 申请权限 申请相关权限&#xff0c;主要是读取存储卡权限&#xff0c;方便后面扫描视频用&#xff1a; getPermission(): void {let array: Array<Permissions> [ohos.permission.WRITE_DOCUMENT,ohos.permission.REA…

城电科技|太阳能折叠灯:点亮你的便捷之光

朋友们&#xff0c;今天要给你们介绍一款能让生活变得更加美好的神器 —— 太阳能折叠灯&#xff01; 【超便捷折叠设计】 它就像一个百变精灵&#xff0c;轻松折叠起来后小巧玲珑。可以随意塞进背包的缝隙&#xff0c;或者放在车载储物箱里&#xff0c;完全不占地方&#xff…

二次封装的天气时间日历选择组件

这个接口没调通 没有数据展示~ userStore.badgeDate是VUEX全部存的日历数据 <template><!-- 日历组件 --><el-date-pickerref"elPicker":size"size"v-model"dateTimeValue":type"dateType":range-separator"rang…

PLC与PLC跨网段通讯的几种方法:厂区组网实践

PLC通常通过以太网或其他工业网络协议&#xff08;如PROFINET、Modbus TCP等&#xff09;进行通信。当PLC位于不同的网段时&#xff0c;它们不能直接通信&#xff0c;需要特殊的配置或设备来实现通信&#xff0c;不同网段的PLC通讯变得尤为重要。 随着工业网络的发展和工业4.0概…

常见的上网方式:PPPoE、静态IP、动态IP地址

常见的上网方式有&#xff1a;PPPoE、静态IP、动态IP地址三种。本文给予简单的介绍&#xff1a; 1.PPPoE PPPoE也叫宽带拨号上网&#xff0c;拨号宽带接入是当前最广泛的宽带接入方式&#xff0c;运营商分配宽带用户名和密码&#xff0c;通过用户名和密码进行用户身份认证。如…

elasticsearch介绍和部署

1 elasticsearch介绍 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。可以很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性。Elasticsearch 的实现原理主要分为以下几个步骤&#xff0c;首先用户将数据提交到Elasticsea…

在SpringBoot项目中集成MongoDB

文章目录 1. 准备工作2. 在SpringBoot项目中集成MongoDB2.1 引入依赖2.2 编写配置文件2.3 实体类 3. 测试4. 文档操作4.1 插入操作4.1.1 单次插入4.1.2 批量插入 4.2 查询操作4.2.1 根据id查询4.2.2 根据特定条件查询4.2.3 正则查询4.2.4 查询所有文档4.2.5 排序后返回 4.3 删除…

Linux相关概念和易错知识点(21)(软硬链接、动静态库)

目录 1.软硬链接 &#xff08;1&#xff09;软链接 &#xff08;2&#xff09;硬链接 ①实现方式及其功能 ②硬链接在目录中的运用 ③计算子目录数量 2.动静态库 &#xff08;1&#xff09;动态库 ①动态链接和静态链接 ②动态库的实现 ③系统查找动态库问题 ④解决…

Leetcode 组合

使用回溯来解决此问题。 提供的代码使用了回溯法&#xff08;Backtracking&#xff09;&#xff0c;这是一种通过递归探索所有可能解的算法思想。以下是对算法思想的详细解释&#xff1a; 核心思想&#xff1a; 回溯法通过以下步骤解决问题&#xff1a; 路径选择&#xff1a…

工具学习_Docker

0. Docker 简介 Docker 是一个开源平台&#xff0c;旨在帮助开发者构建、运行和交付应用程序。它通过容器化技术将应用程序及其所有依赖项打包在一个标准化的单元&#xff08;即容器&#xff09;中&#xff0c;使得应用程序在任何环境中都能保持一致的运行效果。Docker 提供了…

【从零开始的LeetCode-算法】3233. 统计不是特殊数字的数字数量

给你两个 正整数 l 和 r。对于任何数字 x&#xff0c;x 的所有正因数&#xff08;除了 x 本身&#xff09;被称为 x 的 真因数。 如果一个数字恰好仅有两个 真因数&#xff0c;则称该数字为 特殊数字。例如&#xff1a; 数字 4 是 特殊数字&#xff0c;因为它的真因数为 1 和…

day06(单片机高级)PCB设计

目录 PCB设计 PCB设计流程 元器件符号设计 原理图设计 元器件封装设计 元器件库使用 PCB设计 目的&#xff1a;学习从画原理图到PCB设计的整个流程 PCB设计流程 元器件符号设计 元器件符号&#xff1a;这是电子元器件的图形表示&#xff0c;用于在原理图中表示特定的元器件。例…

Oracle JDK(通常简称为 JDK)和 OpenJDK区别

Java 的开发和运行时环境主要由两种实现主导&#xff1a;Oracle JDK&#xff08;通常简称为 JDK&#xff09;和 OpenJDK。尽管它们都基于同一个代码库&#xff0c;但在一些关键点上有所区别。以下是详细的对比&#xff1a; 1. 基础代码 Oracle JDK&#xff1a; 基于 OpenJD…

LeetCode 101题集(随时更新)

题集来源&#xff1a;GitHub - changgyhub/leetcode_101: LeetCode 101&#xff1a;力扣刷题指南 使用C完成相关题目&#xff0c;以训练笔试 贪心 采用贪心的策略&#xff0c;保证每次操作都是局部最优的&#xff0c;从而使最后得到的结果是全局最优的。 分配问题 455. 分发饼…

渗透测试笔记——shodan(4)

声明&#xff1a; 学习视频来自B站up主 【泷羽sec】有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&am…

06 —— Webpack优化—压缩过程

css代码提取后想要压缩 —— 使用css-minimizer-webpack-plugin插件 下载 css-minimizer-webpack-plugin 本地软件包 npm install css-minimizer-webpack-plugin --save-dev 配置 webpack.config.js 让webpack拥有该功能 const CssMinimizerPlugin require(css-minimizer-…