Как использовать intersectionObserver для динамического рендеринга компонентов?

  • 30 августа 2023 г. 22:46
Ответы на вопрос 1
Проблема с текущим кодом заключается в том, что переменная placeholders является общей для всех элементов и всегда имеет одно значение. Чтобы исправить это, необходимо использовать объект Map, в котором ключом будет являться уникальный идентификатор элемента, а значением - флаг, показывающий, является ли элемент видимым или нет.

Перепишем код, чтобы использовать Map:

```javascript
<template v-for="(item, index) in section.items">
  <li
    v-node-intersect="() => handleIntersection(index)"
    class="feed-list-item"
    :key="index"
  >
    <feed-item v-if="!isPlaceholder(index)" :item="item" />
    <content-placeholder v-else />
  </li>
</template>

<script>
import { ref, onMounted } from 'vue'

const intersectionObserver = ref(null)
const placeholders = ref(new Map())

onMounted(() => {
  intersectionObserver.value = new IntersectionObserver(handleIntersection)
})

function handleIntersection(index) {
  return (entries) => {
    const entry = entries[0]
    if (entry.isIntersecting) {
      placeholders.value.delete(index)
    } else {
      if (!placeholders.value.has(index)) {
        placeholders.value.set(index, true)
      }
    }
  }
}

function isPlaceholder(index) {
  return placeholders.value.has(index)
}
</script>
```

Теперь переменная placeholders - это объект Map, в котором находятся уникальные идентификаторы элементов и их состояния видимости. Когда элемент становится видимым, он удаляется из Map, а когда он становится невидимым, он добавляется в Map. Теперь каждый элемент будет иметь уникальное значение идентификатора, которое будет использоваться для определения показа или замены на Placeholder.
Похожие вопросы