typescript - IntersectionObserver 在元素进入 View 之前触发

标签 typescript vue.js vuejs3 vue-composition-api intersection-observer

使用 Vue,我在组件中进行了以下设置:

<template>
  <article>
    <!-- This content spans several viewport heights: you *have* to scroll to get to the bottom -->
    {{ content }}
  </article>

  <span ref="readMarker" />
</template>
// Composition API with <script setup>

const emit = defineEmit<{
  (e: "read", value: number): void
}>()

const readMarker = ref<HTMLSpanElement>()

let observer: IntersectionObserver;
onMounted(() => {
  if (!readMarker.value)
    return

  observer = new IntersectionObserver(
      () => {
        emit("read", 1)
      },
      {
        root: readMarker.value,
      },
  )
  observer.observe(readMarker.value)
})

onDeactivated(() => observer.disconnect())

想法是,当用户滚动到内容底部(rootMarker 进入 View )时,将发出 read 事件。当父级接收到该事件时,它会像这样加载另一个组件,依此类推 (@read.once="loadMore")。

但是,一旦我加载页面,事件就会立即触发,我根本没有时间滚动。每个实例加载后,后续实例的相同事件也会触发。

我还尝试使用 null 作为根并在 onMounted 之外创建观察者(onMounted 仅包含 observer.observe() 调用),但这没有任何改变。

我显然误解了 IntersectionObserver 的某些内容,但我对这种行为真的很困惑。

最佳答案

事实证明,如果你想观察视口(viewport)本身的滚动,IntersectionObserver 的 root 必须是 document 本身,而在我的问题中我是尝试将 readMarker.value 设置为根,这样观察者只会查看它,当然,会立即将其视为“可见”。

关于typescript - IntersectionObserver 在元素进入 View 之前触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69794679/

相关文章:

javascript - Vue 3 : prop with Validator => TypeScript Error Claiming Other prop Does not Exist

angular - 具有不同 View 的一个组件

javascript - 模块解析失败 : The keyword 'interface' is reserved using turbo repo Next. js 13

angular - 如何在循环中发送 http get 方法 Typescript

typescript - 如何使用设置脚本、 typescript 和组合 API 在 vue 中使用验证器

javascript - 如何删除 Vue.js 中值中的逗号

angular - AG-GRID 无法将图标按钮添加到我的 ag-grid 中的 ag-grid 和多选复选框的每一行

vue.js - 我无法在 Ubuntu 中运行 vue cli - 错误 : Unable to access jarfile/snap/vue/1/jar/vue-1. 0-SNAPSHOT.jar

javascript - Vue为每个项目向下滑动过渡

typescript - this.$store 在 Vue 3 中未定义,带有 Vuex 4 商店和路由器