说明:
虽然我们已经做了组件数据懒加载,但是由于它内部的图片非常多,如果一个组件内图片非常<br /> 多的时候,我们依旧有必要做一下图片懒加载,把网络性能优化做到极致
实现方式:
在vue3中通过自定义指令的方式达成图片懒加载的效果
现在的代码使用:
<img src="http://xxx.com/x.jpg" />
使用目标: ** 通过自定义指令完成的
使用目标-: 只有当这个图片进入可视区时,才去请求图片对应的资源--<img v-imgLazy="http://xxx.com/x.jpg" />
前提 先要会定义自定义指令:
自定义指令(vue3)
1. 定义格式
// 定义全局指令const myPlugin = {install (app) {// app是Vue实例。 e.g: app = createApp()app.directive('指令名', {// 省略其他生命周期钩子函数// el: 使用了指令的dom// binding.value: v-指令名="binding.value就是这里表达式的值"mounted (el, binding) {console.log(el, binding.value)}})}}export myPlugin // 在main.js中记得注册一下 createApp(App).use(myPlugin)
2. 使用格式:
<元素 v-指令名="value" /><组件 v-指令名="value" />
落地代码
import { useIntersectionObserver } from '@vueuse/core'import defaultImage from '@/assets/images/200.png'const myDirective = {install (app) {app.directive('imgLazy', {mounted (el, binding) {el.src = defaultImage // 这个是给src一个默认的图片 如果图片没有加载,就用这个图console.log('自定义指令', el, binding)const { stop } = useIntersectionObserver(el, ([{ isIntersecting }], observeDom) => {if (isIntersecting) {stop()el.src = binding.valueel.onerror = function () {console.log('图片请求出错')el.src = defaultImage}}}, { threshold: 0 })}})}}export default myDirective
在组件模板中的使用:
<img v-imgLazy="i.picture" alt=""><img v-imgLazy="good.picture" alt="" />
最终效果:
打开chrome调试面板,network下的img请求,有没有随着滚动行为的发生图片的请求逐渐变多了起来
