Maison >interface Web >Voir.js >Comment implémenter le chargement par défilement infini et l'affichage de la pagination dans les composants Vue

Comment implémenter le chargement par défilement infini et l'affichage de la pagination dans les composants Vue

WBOY
WBOYoriginal
2023-10-09 16:01:441212parcourir

Comment implémenter le chargement par défilement infini et laffichage de la pagination dans les composants Vue

Comment implémenter le chargement par défilement infini et l'affichage de la pagination dans les composants Vue

Dans le développement front-end, nous rencontrons souvent des situations où une grande quantité de données doit être affichée. Afin d'améliorer l'expérience utilisateur, nous affichons généralement les données dans des pages et chargeons automatiquement la page de données suivante lors du défilement vers le bas de la page. Cet article expliquera comment utiliser les composants Vue pour implémenter des fonctions de chargement par défilement infini et d'affichage de pagination, et donnera des exemples de code spécifiques.

Tout d'abord, nous devons préparer l'interface backend pour obtenir les données de pagination. Supposons que nous ayons une interface /api/data, à travers laquelle nous pouvons obtenir la liste de données du numéro de page (page) spécifié. Le format de données renvoyé par l'interface est le suivant : /api/data,通过该接口可以获取指定页码(page)的数据列表。接口返回的数据格式如下:

{
  "total": 100, // 总数据条数
  "list": [...] // 当前页的数据列表
}

接下来,我们可以使用Vue的组件化开发思想,将滚动加载和分页展示的功能封装成一个独立的组件。我们可以称之为InfiniteScroll组件。首先,我们需要在父组件中引入该组件,并传入必要的参数。

<template>
  <div>
    <infinite-scroll
      :api-url="'/api/data'" // 后端接口地址
      :page-size="10" // 每页数据条数
      @load-next-page="loadNextPage"
    >
      <!-- 数据展示的代码 -->
    </infinite-scroll>
  </div>
</template>

InfiniteScroll组件中,我们需要监听滚动事件,并在滚动到页面底部时触发加载下一页数据的操作。我们可以使用window对象的scroll事件来监听滚动事件。

export default {
  data() {
    return {
      page: 1, // 当前页码
      total: 0, // 总数据条数
      list: [] // 当前页的数据列表
    };
  },
  mounted() {
    window.addEventListener('scroll', this.handleScroll);
  },
  destroyed() {
    window.removeEventListener('scroll', this.handleScroll);
  },
  methods: {
    handleScroll() {
      const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
      const windowHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
      const documentHeight = document.documentElement.scrollHeight || document.body.scrollHeight;

      if (scrollTop + windowHeight >= documentHeight) {
        this.loadNextPage();
      }
    },
    async loadNextPage() {
      if (this.page >= Math.ceil(this.total / this.pageSize)) {
        return; // 已加载所有数据
      }

      const response = await fetch(`${this.apiUrl}?page=${this.page + 1}`);
      const result = await response.json();

      this.total = result.total;
      this.list = [...this.list, ...result.list];
      this.page++;
    }
  }
};

在上面的代码中,我们使用window.addEventListener方法来添加滚动事件监听,以便在滚动到页面底部时触发加载下一页数据的操作。同时,在组件销毁时需要使用window.removeEventListener方法来移除滚动事件监听。

handleScroll方法中,我们首先获取当前滚动的位置,包括页面滚动的距离(scrollTop)、视窗的高度(windowHeight)和文档的总高度(documentHeight)。然后判断当滚动位置加上视窗高度大于等于文档总高度时,说明已经滚动到页面底部,将触发加载下一页数据的操作。

loadNextPage方法中,我们首先判断是否已经加载所有数据,即当前页码是否大于数据总页数。如果已加载所有数据,则直接返回。否则,通过异步请求获取下一页数据,并将返回的数据合并到原有数据列表中,同时更新当前页码和总数据条数。

最后,在InfiniteScroll组件内部,我们可以根据获取到的数据进行相应的展示。

<template>
  <div>
    <ul>
      <li v-for="item in list" :key="item.id">{{ item.name }}</li>
    </ul>
    <div v-if="page >= Math.ceil(total / pageSize)">已加载所有数据</div>
  </div>
</template>

在上面的代码中,我们通过v-for指令遍历数据列表,并根据每个元素的id属性作为key,保证列表元素的唯一性。同时,我们在组件底部添加一个提示,当页码大于等于总数据页数时,显示"已加载所有数据"的提示信息。

综上所述,我们通过引入InfiniteScrollrrreee

Ensuite, nous pouvons utiliser l'idée de développement de composants de Vue pour encapsuler les fonctions de chargement par défilement et d'affichage de pagination dans un composant indépendant. Nous pouvons l'appeler le composant InfiniteScroll. Tout d’abord, nous devons introduire le composant dans le composant parent et transmettre les paramètres nécessaires.

rrreee

Dans le composant InfiniteScroll, nous devons écouter l'événement scroll et déclencher le chargement de la page de données suivante lors du défilement vers le bas de la page. Nous pouvons utiliser l'événement scroll de l'objet window pour écouter les événements de défilement. 🎜rrreee🎜Dans le code ci-dessus, nous utilisons la méthode window.addEventListener pour ajouter un écouteur d'événement de défilement afin de déclencher le chargement de la page de données suivante lors du défilement vers le bas de la page. Dans le même temps, vous devez utiliser la méthode window.removeEventListener pour supprimer l'écouteur d'événement de défilement lorsque le composant est détruit. 🎜🎜Dans la méthode handleScroll, nous obtenons d'abord la position de défilement actuelle, y compris la distance de défilement de la page (scrollTop), la hauteur de la fenêtre (windowHeight) et la hauteur totale du document (documentHeight). Ensuite, il est déterminé que lorsque la position de défilement plus la hauteur de la fenêtre est supérieure ou égale à la hauteur totale du document, cela signifie que la page a défilé vers le bas, et l'opération de chargement de la page de données suivante sera déclenché. 🎜🎜Dans la méthode loadNextPage, nous déterminons d'abord si toutes les données ont été chargées, c'est-à-dire si le numéro de page actuel est supérieur au nombre total de pages de données. Si toutes les données ont été chargées, revenez directement. Sinon, obtenez la page de données suivante via une requête asynchrone, fusionnez les données renvoyées dans la liste de données d'origine et mettez à jour le numéro de page actuel et le nombre total d'éléments de données en même temps. 🎜🎜Enfin, à l'intérieur du composant InfiniteScroll, nous pouvons afficher les données en conséquence. 🎜rrreee🎜Dans le code ci-dessus, nous parcourons la liste de données via l'instruction v-for et utilisons l'attribut id de chaque élément comme clé , garantissant l'unicité des éléments de la liste. Dans le même temps, nous ajoutons une invite au bas du composant. Lorsque le numéro de page est supérieur ou égal au nombre total de pages de données, le message d'invite « Toutes les données ont été chargées » s'affiche. 🎜🎜Pour résumer, en introduisant le composant InfiniteScroll et en donnant les paramètres correspondants, nous pouvons réaliser les fonctions de chargement par défilement infini et d'affichage de pagination. En écoutant les événements de défilement, la page de données suivante est automatiquement chargée lors du défilement vers le bas de la page pour obtenir l'effet de chargement de défilement infini. Dans le même temps, en mettant à jour les données du composant, l'affichage des pages est effectué en fonction du nombre d'éléments de données sur chaque page et du nombre total d'éléments de données. 🎜🎜J'espère que les exemples de code fournis dans cet article vous seront utiles et vous permettront d'implémenter des fonctions de chargement par défilement infini et d'affichage de pagination dans les composants Vue. Si vous avez des questions ou des suggestions d'amélioration, veuillez laisser un message pour discussion. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn