图片懒加载优化
懒加载指令的逻辑直接放到入口文件中不合理。main.js入口文件通常只做一些初始化的事情,不应该包含太多的逻辑代码,在这里通过插件的方法把懒加载指令封装为插件,main.js入口文件只需要负责注册插件。另外useIntersectionObserver对元素的监听是一直存在的,存在内存浪费。
一、封装自定义指令为插件
1.在directives文件夹下新建index.js文件,并写入以下代码;
// 引入vueuse中的懒加载
import { useIntersectionObserver } from '@vueuse/core'
export const directivePlugin = {
install(app) {
// 图片懒加载逻辑
app.directive('img-lazy', {
mounted(el, binding) {
// el 表示使用指令的那个元素 在这里为img
// binding:binding.value 指令等于号后边绑定的值 这里为图片的url地址
console.log(el, binding.value);
useIntersectionObserver(
// el 需要添加懒加载指令的元素
el,
// isIntersecting 布尔值 实时告诉我们当前元素是否进入视口区域
([{ isIntersecting }]) => {
if (isIntersecting) {
// 进入视口区域了
el.src = binding.value
}
},
)
}
})
}
}
2.在入口文件main.js中使用封装好的这个图片懒加载插件;
// 引入封装好的图片懒加载插件
import { directivePlugin } from './directives'
app.use(directivePlugin)
二、优化useIntersectionObserver对元素的监听
使用官网提供的stop方法控制,在元素第一次进入视口区域后就停止监听。
H_HX126: 我觉得是的,建议用mul吧,更贴合
Yigezxy: mul和times一回事吗
wuhaot0915: 可以 优秀
H_HX126: 或者说你用的是不是vue3,vue3的vite里好像没有require
H_HX126: 我没报这个错,你排查一下吧 (1)确保你的项目中使用的构建工具(如 Webpack)已经正确配置,能够处理 ES6 模块。 (2)如果你在使用 Node.js,确保你的 Node.js 版本支持 ES6 模块,或者使用适当的工具来转译你的代码。 (3)检查 @jiaminghi/data-view 库的文档,确认它是如何发布的(ES6 模块、CommonJS 或 UMD),并根据其发布方式调整你的导入语句。 (4)如果必要,使用 Babel 或其他转译工具来转换你的 ES6 代码,以便在不支持 ES6 的环境中运行。