基于vue3.0和IntersectionObserver封装懒加载指令
vue
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
项目地址:https://gitcode.com/gh_mirrors/vu/vue
免费下载资源
·
目的: 当图片进入可视区域内去加载图片,且处理加载失败,封装成指令。
介绍一个webAPI:IntersectionObserver
// 创建观察对象实例
const observer = new IntersectionObserver(callback[, options])
// callback 被观察dom进入可视区离开可视区都会触发
// - 两个回调参数 entries , observer
// - entries 被观察的元素信息对象的数组 [{元素信息},{}],信息中isIntersecting判断进入或离开
// - observer 就是观察实例
// options 配置参数
// - 三个配置属性 root rootMargin threshold
// - root 基于的滚动容器,默认是document
// - rootMargin 容器有没有外边距
// - threshold 交叉的比例
// 实例提供两个方法
// observe(dom) 观察哪个dom
// unobserve(dom) 停止观察那个dom
基于vue3.0和IntersectionObserver封装懒加载指令
import defaultImg from '@/assets/images/200.png'
export default {
install (app) {
// 在app上进行扩展 app提供 component directive 函数
// 如果要挂载原型 app.config.globalProperties 方式
defineDirective(app)
}
}
const defineDirective = (app) => {
// 1.图片懒加载指令 v-lazy
// 原理:先存储图片地址不能在src上 当图片进入可视区 将你存储图片地址设置给图片元素
app.directive('lazy', {
// vue2.0 监听使用指令的DOM是否创建好 钩子函数:inserted
// vue3.0 的指令拥有的钩子函数和组件一样 钩子函数:mounted
mounted (el, binding) {
// 2.创建一个观察对象 来观察当前使用指令的元素
const observe = new IntersectionObserver(([{ isIntersecting }]) => {
if (isIntersecting) {
// 停止观察
observe.unobserve(el)
// 4.处理图片加载失败
el.onerror = () => {
// 加载失败 设置默认图
el.src = defaultImg
}
// 3.把指令的值设置给el的src属性 binding.value就是指令的值
el.src = binding.value
}
}, {
threshold: 0
})
// 开启观察
observe.observe(el)
}
})
}
在main.js中注册
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).use(directive).mount('#app')
使用指令:
将原本的 :src 变成我们刚才写的 v-lazy 指令
<div v-for="cate in list" :key="cate.id">
<img v-lazy="cate.picture" alt="">
</div>
这样我们的图片懒加载指令就完成了。
GitHub 加速计划 / vu / vue
207.54 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:2 个月前 )
73486cb5
* chore: fix link broken
Signed-off-by: snoppy <michaleli@foxmail.com>
* Update packages/template-compiler/README.md [skip ci]
---------
Signed-off-by: snoppy <michaleli@foxmail.com>
Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 4 个月前
e428d891
Updated Browser Compatibility reference. The previous currently returns HTTP 404. 5 个月前
更多推荐
已为社区贡献1条内容
所有评论(0)