JS基础 | 实现懒加载

1、懒加载的概念

        只在数据或内容即将进入视口或即将需要的时候才加载。

2、实现懒加载的好处

        (1)提高页面加载速度和响应速度。只加载当前用户需要或将要浏览到的数据,避免一次性加载大量不必要的数据。

        (2)节省用户流量。只加载用户浏览到的数据,避免加载用户未浏览的数据,特别是对于移动端用户来说可以节省流量。

        (3)优化用户体验。避免一次性加载大量数据导致页面卡顿,样式渲染跳跃等影响用户体验的问题。

3、实现懒加载的弊端

        (1)首屏加载会较慢,而一些关键数据又需要首屏加载,需要权衡。

        (2)需要监听浏览器事件并判断元素是否进入视口,稍微增加了开发难度。

        (3)如果数据较多,需要加载的内容较长,用户体验还是会受到影响。懒加载并非银弹,还需要结合其他优化手段。

        (4)不利于 SEO。搜索引擎爬虫抓取不到实际内容,抓取到的可能是 loading 占位图等,影响网页Indexed和排名。

        所以,懒加载是一种非常 useful 的技术,可以极大提高用户体验和网页性能,但也有一定的弊端,需要权衡选择。一般来说,对于加载的数据较多,页面性能和流量较为关注的场景,懒加载是一个不错的方案。但如果对 SEO 优化要求较高,或者加载的数据较少,也可以不使用懒加载。

4、实现图片懒加载的步骤

        (1)为图片添加默认的 loading 图片源和真实的 data-src 属性

<img src="loading.gif" data-src="real-img.jpg" />

        (2)获取所有图片元素

const images = document.querySelectorAll('img');

        (3)监听页面滚动事件

window.addEventListener('scroll', loadImages);

        (4)定义 loadImages 函数来加载图片

function loadImages() {
  for (let i = 0; i < images.length; i++) {
    // 获取图片源和位置信息
    let imgSrc = images[i].dataset.src;
    let imgRect = images[i].getBoundingClientRect();
    
    if (imgRect.top < window.innerHeight && imgRect.left < window.innerWidth
     && imgRect.right > 0 && imgRect.bottom > 0) {  
      // 图片进入视口,加载真实图片源
      images[i].src = imgSrc;  
      images[i].addEventListener('load', () => { 
        images[i].style.opacity = 1;  // 淡入效果
      });
    } 
  }
}

        (5)页面初始化时调用一次 loadImages,防止某些图片已进入视口但未加载

loadImages();

        (6)为避免加载较大图片导致页面卡顿,可以考虑在图片加载完成后设置淡入效果

images[i].addEventListener('load', () => { 
  images[i].style.opacity = 1;  
});

5、实现列表懒加载

// 定义页码和加载条数
const pageSize = 10;   
let currentPage = 1;  

// list 代表拥有滚动条的元素, 看你代码如何定义,可以是网页窗口 window、div元素、ul列表等等
// 需要先获取list 元素,再监听列表中的元素进入视口事件,判断元素位置并加载数据
list.addEventListener('scroll', () => {
  Array.from(list.children).forEach(elem => {
    let top = elem.offsetTop;
    let height = elem.clientHeight;
    if (top > 0 && top < window.innerHeight) {  
      // 元素进入视口,加载数据
      fetchData(currentPage);
      currentPage++;
    }
  });
}); 
定义 fetchData() 方法根据页码加载数据,并更新元素内容:
function fetchData(page) {
  // 发起请求,加载第page页的数据,此处省略调用接口的代码,根据自己代码结构加入即可
  ...
  ...
  // 更新列表中符合页码的元素内容
  Array.from(list.children).forEach(elem => {
    if (elem.dataset.page === page) {  
      elem.innerHTML = ... // 加载的数据内容
    }
  });
} 
// 初始化加载第一页数据,并为每个列表元素添加 data-page 属性:
fetchData(1);
Array.from(list.children).forEach((elem, index) => {
  elem.dataset.page = index % 10 + 1;  // 每10个元素为一页
});

6、实现列表滚动加载

// 1. 定义页面大小、每页加载条数和当前页码:
const pageSize = 10;     // 每页10条数据 
const listHeight = 400;  // 比如列表容器高度400px 
let currentPage = 1;     // 当前页码
let scrollTop = 0;  // 上一次滚动条位置 

//  2. 绑定滚动事件,判断滚动方向并加载数据:
list.addEventListener('scroll', () => {
  let scrollHeight = list.scrollHeight;  // 滚动内容高度
  let clientHeight = list.clientHeight;  // 视口高度
  let scrollDirection = scrollTop - list.scrollTop; 
  // 向下滚动
  if (scrollDirection > 0 && scrollHeight - clientHeight - list.scrollTop <= pageSize * 3) {
    // 滚动到底部,加载下一页
    currentPage++;
    fetchData(currentPage); 
  } 
  
  // 向上滚动 
  if (scrollDirection < 0 && list.scrollTop <= pageSize * 3) {
    // 滚动到顶部,加载上一页
    currentPage--; 
    fetchData(currentPage);
  }
  
  scrollTop = list.scrollTop;  // 更新滚动条位置
}); 
// 定义 fetchData() 方法,根据页码加载数据:
function fetchData(page) {
  // 发起请求,加载第page页的数据
  ...
  
  // 将新加载的数据添加到列表尾部
  list.append(...); 
}
// 初始化获取第一页数据
fetchData(1)

7、实现路由懒加载

        为给客户更好的客户体验,首屏组件加载速度更快一些,解决白屏问题。

        (1)ES6推荐方式imprort ()

const HelloWorld = () => import('需要加载的模块地址')

        (2)vue异步组件实现路由懒加载

component:resolve => (['需要加载的路由的地址', resolve])

        (3)webpack提供的require.ensure()实现懒加载

import Vue from 'vue';
import Router from 'vue-router';
Vue.use('Router')
export default new Router({
    routes:[{
        {
            path:'./',
            name:'HelloWorld',
            component: r => require.ensure([], () => r(require('@/components/home')), 'demo')
        }
    }]
})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
非常感谢您的问题。针对上一个回答中提到的几个技术点,我来逐一回答您的问题。 1. Vuex如何实现状态管理? Vuex是Vue.js官方提供的状态管理库,可以方便地管理Vue.js应用程序中的所有组件的状态。Vuex的核心概念包括state、mutation、action和getter。 - state:存储应用程序的状态数据。 - mutation:用于修改state中的数据,是唯一可以修改state中数据的方式。 - action:用于处理异步操作和逻辑,可以触发mutation来修改state中的数据。 - getter:用于获取state中的数据,可以进行计算和过滤等操作。 通过Vuex,我们可以将应用程序中的状态进行统一管理,避免了组件之间的混乱和冗余代码。 2. 组件传值有什么好处? 组件传值是Vue.js中非常基础和重要的概念。组件传值可以将父组件的数据传递给子组件,子组件可以通过props来接收父组件的数据。组件传值可以实现组件之间的数据交互和通信,使得组件之间的耦合度更低,更加灵活和可复用。 3. 什么是异步组件? 异步组件是Vue.js中一种优化技术,可以延迟组件的加载时间,提高应用程序的性能。在异步组件中,组件会在需要被渲染时才会被加载,而不是在应用程序启动时一次性加载所有组件。 Vue.js提供了两种异步组件的方式:使用工厂函数和使用动态import。使用工厂函数时,我们可以在组件的定义中使用import()来异步加载组件;而使用动态import时,我们可以使用Vue.js提供的异步组件API,将组件定义为一个返回Promise的函数,然后在需要时进行加载。 4. 路由懒加载实现 路由懒加载是Vue.js中另一种常用的优化技术,可以将应用程序的路由进行按需加载,提高应用程序的性能。在路由懒加载中,路由组件会在需要被渲染时才会被加载,而不是在应用程序启动时一次性加载所有路由组件。 在Vue.js中,实现路由懒加载的方法非常简单,只需要使用Webpack提供的import()函数定义路由组件,然后在路由配置中使用component属性来引用路由组件即可。例如: ``` const Home = () => import(/* webpackChunkName: "home" */ './views/Home.vue') const router = new VueRouter({ routes: [ { path: '/', name: 'home', component: Home } ] }) ``` 在上面的代码中,我们使用import()函数定义了Home组件,并在路由配置中使用了component属性引用了Home组件。在应用程序运行时,Home组件会在需要被渲染时才会被加载。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值