• Vue中IntersectionObserver API的用法介绍
  • 发布于 1周前
  • 64 热度
    0 评论
要在 Vue 中创建一个自定义指令,用于元素曝光上报埋点,可以使用 IntersectionObserver API 来检测元素何时进入或离开视口。以下是一个示例,展示如何实现这个功能:
Vue.directive('exposure', {
  inserted(el, binding) {
    // 创建一个 IntersectionObserver 实例
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          // 元素进入视口,触发曝光上报
          if (typeof binding.value === 'function') {
            binding.value(entry.target); // 传递元素给回调函数
          }
          // 如果只需要一次曝光上报,可以在上报后停止观察
          observer.unobserve(entry.target);
        }
      });
    });
    // 堆代码 duidaima.com
    // 开始观察元素
    observer.observe(el);

    // 将 observer 保存到元素上,以便在 unbind 钩子中可以访问
    el._observer = observer;
  },
  unbind(el) {
    // 停止观察元素
    if (el._observer) {
      el._observer.disconnect();
      delete el._observer;
    }
  }
});

// 使用示例
new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  },
  methods: {
    reportExposure(element) {
      console.log('Element exposed:', element);
      // 在这里执行你的上报逻辑,比如发送请求到服务器
    }
  },
  template: `
    <div id="app">
      <div v-exposure="reportExposure" style="height: 200px; background-color: lightblue;">
        Scroll down to expose this element
      </div>
    </div>
  `
});
解释
•IntersectionObserver: 这个 API 用于异步观察目标元素与祖先元素或顶级文档视口的交叉状态。它在元素进入或离开视口时触发回调。
•inserted 钩子: 在元素插入到父节点时触发,用于初始化 IntersectionObserver 并开始观察元素。
•unbind 钩子: 在指令与元素解绑时触发,用于停止观察元素并清理资源。

使用方式
•在 Vue 组件中使用 v-exposure 指令,并传递一个处理曝光上报的回调函数。
•回调函数将在元素进入视口时被调用,接收目标元素作为参数。
•如果只需要一次曝光上报,可以在回调函数中调用 observer.unobserve(entry.target) 来停止观察。

目前,开源社区中并没有一个名为 v-exposure 的专用指令库。然而,有一些项目和库实现了类似的功能,可以参考Vue Observe Visibility:
•这是一个 Vue 插件,使用 IntersectionObserver 来检测元素的可见性。虽然它的名字不是 v-exposure,但它提供了类似的功能,可以用来实现曝光检测。
•GitHub: Akryum/vue-observe-visibility[1]

如果你想要一个专门名为 v-exposure 的指令,可能需要基于这些现有的库创建一个自定义指令。你可以参考这些库的实现方式,结合 IntersectionObserver API 来开发一个符合你需求的指令。
用户评论