• 懒加载指令实现


    问题:页面过长,下面的图片不一定访问到,存在一定浪费。

    解决方案:图片懒加载,仅当进入视口区,才发送请求显示图片。

    全局指令

    1. // 全局指令
    2. app.directive('指令名称',{
    3. mounted(el, binding){
    4. // el:指令绑定的元素
    5. // binding:绑定的表达式。binding.value为表达式的值
    6. }
    7. })

    在入口文件main.js中,定义一个全局指令第一个参数是指令名称,为 img-lazy,需要图片懒加载时,调用 v-img-lazy 实现。即 全局指令使用 v-指令名称 实现;第二个参数是一个钩子,钩子内的第一个参数是元素,第一个参数是绑定的表达式

     判断是否进入视口

    vueuse插件中提供 useIntersectionObserver 方法,用于判断元素是否进去视口区。

    1. import { useIntersectionObserver } from '@vueuse/core'
    2. const { stop } = useIntersectionObserver(
    3. el,
    4. ([{ isIntersecting }]) => {
    5. ...
    6. // el:监听的目标对象/元素
    7. //isIntersecting: 是否进入视口区域
    8. }
    9. )

    如果进入视口,发送图片资源请求。优化:重复监听

    1. import { useIntersectionObserver } from '@vueuse/core'
    2. const { stop } = useIntersectionObserver(
    3. el, // 监听的目标对象/元素
    4. ([{ isIntersecting }]) => {
    5. // 进入视口区域
    6. if(isIntersecting){
    7. el.src = binding.value
    8. stop() // 停止监听
    9. }
    10. }
    11. )

    停止监听:由方法解构出 stop 方法,可用于在 第一次完成加载后,调用stop() 来停止监听。 

    测试 - 在组件中调用懒加载指令(全局指令)

    模板中,使用 v-指令名 调用,如 v-img-lazy

    1. 'i.picture' />
    2. // <元素 v-指令名称='binding'>

    优化:封装成插件

    问题:逻辑书写位置不合理(在main.js中写逻辑)

    解决:将懒加载指令封装成插件,main.js入口文件仅负责注册插件

    1. // src/directives/index.js中(插件中)
    2. const directivePlugin = {
    3. install(app){
    4. ... // 使用app实现懒加载指令
    5. }
    6. }
    1. // main.js
    2. import directivePlugin from '@/directives/index'
    3. app.use(directivePlugin) // 注册插件

    完整代码:

    (优化前)

     优化后:

    1. // src/directives/index.js
    2. import { useIntersectionObserver } from '@vueuse/core'
    3. // 定义懒加载插件
    4. export const lazyPlugin = {
    5. install(app){
    6. // ★定义全局指令 - (懒加载实现思路:监听到进入视口,将src绑定给后面的值)
    7. // app挂载后,app.directive('指令名称', 钩子(el,binding){ })
    8. app.directive('img-lazy', {
    9. mounted(el, binding){
    10. // el: 指令绑定的那个元素 img
    11. // binding: binding.value 指令等于后面绑定的表达式的值 图片的url
    12. // vueuse插件的方法,useIntersectionObserver:是否进去视口区域,stop第一次加载后停止监听->重复加载
    13. const { stop } = useIntersectionObserver(
    14. el,
    15. ([{ isIntersecting }]) => {
    16. // console.log(isIntersecting);
    17. if(isIntersecting){
    18. el.src = binding.value
    19. stop()
    20. }
    21. }
    22. )
    23. }
    24. })
    25. }
    26. }

  • 相关阅读:
    C# 图解教程 第5版 —— 第7章 深入理解类
    C++的内存管理是怎样的?
    力控软件与2台200Smart之间无线以太网通信
    apple pencil性价比高吗?适用ipad的电容笔推荐
    Kafka为什么这么快?它的高性能是如何实现的?
    安装npm包时出现依赖树错误的解决办法
    pycharm使用Git拉取最新代码(配置了远程服务器)
    docker安装常用服务(mysql、redis、nginx、tomcat、MongoDB、Elasticsearch)
    Python基础语法(四)—— 列表+元组+字典
    typedef的用法——c语言
  • 原文地址:https://blog.csdn.net/weixin_42479421/article/details/132793055