Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

VueUse

VueUse是一个十分方便的Vue工具库,大大的提高了工作效率,官网地址:vueuse.org/

利用vueuse简单实现vue懒加载指令实现

传统的图片懒加载通过滚动偏移计算,纯手写的话有一定的代码量,所以这里打算用vueuse写一个自定义指令。

下载VueUse

1
$ "pnpm i @vueuse/core"

创建懒加载指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ "
// /directives/imgLazy.js
// 文档地址:[useIntersectionObserver | VueUse](https://vueuse.org/core/useIntersectionObserver/)
import { useIntersectionObserver } from '@vueuse/core';

export default {
bind(el, bidding) {
const { stop } = useIntersectionObserver(
el,
([{ isIntersecting }], observerElement) => {
// 滚动到范围,isIntersecting为true
if(isIntersecting){
let defaultSrc = el.getAttribute('data-img');
// 直接赋值src会被识别为静态文件,用require关键字可以解决,require关键字只接收字符串不支持变量,所以这里用了字符串模板拼接。
el.src = require(`@/assets/${defaultSrc}`);
el.removeAttribute("data-img");
// 这里建议调用stop回调,默认情况滚动到区域以外也会被触发。
stop();
}
},
)
}
}
"

批量注入自定义指令(全局)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ "
// /directives/index.js
import debounce from "./debounce";
import imgLazy from "./imgLazy"; // 自定义指令

const directives = {
debounce,
imgLazy
};

export default {
install(Vue) {
Object.keys(directives).forEach((key) => {
Vue.directive(key, directives[key])
})
},
}

// main.js
// 自定义指令 批量导入
import Directives from '../directives/index'
Vue.use(Directives)
"

没有到范围区域统一默认显示加载图片(这里先用的vue的logo),从network资源观察只有一个图片请求。

使用自定义指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ "
<template>
<div>
<div class="imgBox">
<div class="p_margin-top-1500px">
<img v-for="(item,index) in bannerArr" :key="index"
src="../../assets/logo.png"
:data-img="item"
alt="banner"
v-img-lazy>
</div>
</div>
</div>
</template>

<script>
export default{
data(){
return{
bannerArr: ['banner1.png', 'banner2.png', 'banner3.png']
}
}
}
</script>
"

图片元素增加自定义指令”v-img-lazy”

评论