【问题标题】:Vue 3 directives – how to push array of items to directiveVue 3 指令 - 如何将项目数组推送到指令
【发布时间】:2021-01-02 21:47:50
【问题描述】:

由于 Vue 3 没有 IntersectionObserver 库,我想实现自己的小解决方案。

我阅读了有关指令的信息,据我了解,这是正确的方向。 (?)

我的本​​地指令:

directives: {
    'lazyload': {
      mounted(el) {
        if ('IntersectionObserver' in window) {        
          let intersectionObserver = new IntersectionObserver((entries, observer) => {
            entries.forEach((entry) => {
              if (entry.isIntersecting) {
                const lazyImage = entry.target;
                
                // set data-srcset as image srcset
                lazyImage.srcset = lazyImage.getAttribute('data-srcset');
                
                // add class after image has loaded
                lazyImage.addEventListener('load', () => {
                  lazyImage.classList.add('is-lazyloaded');
                };
                // unobserve after
                lazyLoadItemObserver.unobserve(lazyImage);
              }
            });
          });
          
          // observe every image
          const lazyLoadItems = document.querySelectorAll('[lazyload]')
          
          lazyLoadItems.forEach((lazyImage) => {
            lazyLoadItemObserver.observe(lazyImage);
          });
  
        }
      }
    }
  }

例如,普通的方法是从每个具有 attribute lazyload<IMG> 元素中创建一个数组。我不明白的是如何从每个具有v-lazyload 绑定的<IMG> 中创建一个数组。

类似于“如果此图像具有 v-lazyload 绑定,则将其放入 IntersectionObserver 的数组中。”不过我可能理解错了。

所以我想提出一个指令,它设置一个 IntersectionObserver,它观察所有具有 v-lazyload 绑定的图像的数组。

【问题讨论】:

    标签: javascript vue.js vuejs3


    【解决方案1】:

    v-lazyload 指令已经在目标元素上,因此无需查询文档。

    在指令的mounted 钩子中,如果父节点不存在,您可以将IntersectionObserver 实例附加到父节点。然后,使用该实例来观察目标元素(同样不观察 unmounted 中的元素):

    directives: {
      mounted(el) {
        el.parentNode.lazyLoadItemObserver = el.parentNode.lazyLoadItemObserver || new IntersectionObserver(/*...*/)
        el.parentNode.lazyLoadItemObserver.observe(el)
      },
      unmounted(el) {
        el.parentNode.lazyLoadItemObserver.unobserve(el)
      },
    }
    

    demo

    【讨论】:

    • 嗨 Toni,感谢演示和洞察力!但问题是我想避免为每个单独的图像元素单独设置一个交叉点观察器,但在根主体元素上使用 1 个交叉点观察器来观察每个具有延迟加载指令的图像。
    • 好的。然后你可以使用我概述的相同方法,但不要使用el.parentNode,而是使用document.body
    • 啊,是的。我的问题是,我的代码为每个图像创建了一个 IntersectionObserver,因为我没有检查是否已经存在像你一样的图像。谢谢,新年快乐!
    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2021-09-11
    • 2021-03-11
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多