Vue分页组件实现过程详解

下面是详细讲解“Vue分页组件实现过程详解”的完整攻略。

1. 分页组件概述

分页组件是网页中常用的组件之一。它用于在一页内容过多的情况下,将内容分为多页展示,便于用户浏览和操作。Vue.js在处理分页组件时,提供了一种简单且高度可定制的方式。

2. 分页组件实现的基本步骤

2.1 设计组件结构:包括需求分析,页面布局设计,功能需求设计。

2.2 实现组件结构:分别实现分页栏,页码等子组件。

2.3 完善功能:组件常见功能包括点击页码跳转到指定页面,改变每页显示的数据条数,更新分页状态等。

3.分页组件示例1

以下示例中,我们将实现一个简单的分页组件,该组件可以根据用户点击页码或点击“下一页”和“上一页”按钮,让用户浏览大量数据。

3.1 实现组件结构

我们先在Vue中定义一个名为page的组件。在组件中,我们使用props传递需要渲染的数据和每页显示的数据条数:

<template>
  <div>
    <!-- 待渲染数据 -->
    <ul>
      <li v-for="item in data">{{ item }}</li>
    </ul>

    <!-- 分页效果 -->
    <div>
      <button :disabled="currentPage === 1" @click="gotoPage(currentPage - 1)">上一页</button>
      <span v-for="index in pages" :key="index" @click="gotoPage(index)" :class="{'active': currentPage === index}">
        {{ index }}
      </span>
      <button :disabled="currentPage === totalPages" @click="gotoPage(currentPage + 1)">下一页</button>

      <select v-model="pageSize" @change="changePageSize">
        <option v-for="size in pageSizes">{{ size }}条/页</option>
      </select>
      <span>{{ currentPage }} / {{ totalPages }}页</span>
    </div>
  </div>
</template>

<script>
export default {
  name: 'page',
  props: {
    data: {
      type: Array,
      default: []
    },
    count: {
      type: Number,
      default: 0
    },
    pageSize: {
      type: Number,
      default: 10
    },
    pageSizes: {
      type: Array,
      default: () => [10, 20, 30, 40]
    }
  },
  data() {
    return {
      currentPage: 1
    }
  },
  computed: {
    // the total number of pages
    totalPages() {
      return Math.ceil(this.count / this.pageSize)
    },
    // the page list to display in the pagination bar
    pages() {
      const pageCount = 7
      const currentPage = this.currentPage
      const totalPages = this.totalPages
      const half = Math.floor(pageCount / 2)

      let start = Math.max(currentPage - half, 1)
      let end = Math.min(start + pageCount - 1, totalPages)

      if (end - start < pageCount) {
        start = end - pageCount + 1
      }

      const pagesList = []
      for (let i = start; i <= end; i++) {
        pagesList.push(i)
      }

      return pagesList
    }
  },
  methods: {
    gotoPage(pageNumber) {
      if (pageNumber < 1) {
        this.currentPage = 1
      } else if (pageNumber > this.totalPages) {
        this.currentPage = this.totalPages
      } else {
        this.currentPage = pageNumber
      }
      // emit out the page change event
      this.$emit('page-changed', { page: this.currentPage, size: this.pageSize })
    },
    changePageSize(event) {
      const newSize = parseInt(event.target.value, 10)
      if (this.pageSize !== newSize) {
        this.currentPage = 1
        this.$emit('page-changed', { page: this.currentPage, size: newSize })
      }
    }
  }
}
</script>

3.2 完善功能

以上代码中的功能实现时针对示例1所实现的分页组件,包括基本的页码、上一页、下一页、数据条数的显示和控制,用户可以根据自己的需求进行二次开发。

4. 分页组件示例2

以下示例中,我们将实现一个复杂一些的分页组件,该组件可以根据用户输入的搜索条件,从服务器请求数据,并可以支持跳转到指定的页码。

4.1 实现组件结构

我们同样先在Vue中定义一个名为page的组件,但与上一个示例不同的是,该组件的数据来源于服务器端,我们需要通过ajax等方式从服务器获取数据。

<template>
  <div>
    <input type="text" v-model="searchText" placeholder="请输入搜索关键词" @keyup.enter="search"/>
    <button @click="search">搜索</button>

    <table>
      <thead>
        <tr>
          <th>商品名称</th>
          <th>商品价格</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="item in list" :key="item.id">
          <td>{{ item.name }}</td>
          <td>{{ item.price }}</td>
        </tr>
      </tbody>
    </table>

    <!-- 分页效果 -->
    <div>
      <button :disabled="currentPage === 1" @click="gotoPage(currentPage - 1)">上一页</button>
      <span v-for="index in pages" :key="index" @click="gotoPage(index)" :class="{'active': currentPage === index}">
        {{ index }}
      </span>
      <button :disabled="currentPage === totalPages" @click="gotoPage(currentPage + 1)">下一页</button>
      <input type="text" v-model="jumpPage" placeholder="跳转到第几页" @keyup.enter="gotoPage(jumpPage)">

      <span>{{ currentPage }} / {{ totalPages }}页</span>
    </div>
  </div>
</template>

<script>
export default {
  name: 'page',
  data() {
    return {
      list: [],
      count: 0,
      currentPage: 1,
      pageSize: 10,
      keywords: '',
      jumpPage: ''
    }
  },
  computed: {
    // the total number of pages
    totalPages() {
      return Math.ceil(this.count / this.pageSize)
    },
    // the page list to display in the pagination bar
    pages() {
      if (this.totalPages <= 9) {
        return Array.from({ length: this.totalPages }, (_, index) => index + 1)
      } else if (this.currentPage <= 5) {
        return Array.from({ length: 6 }, (_, index) => index + 1).concat(['...'], [this.totalPages])
      } else if (this.currentPage + 4 >= this.totalPages) {
        return [1, '...', ...Array.from({ length: 6 }, (_, index) => this.totalPages - 5 + index)]
      } else {
        return [
          1,
          '...', 
          ...Array.from({ length: 5 }, (_, index) => this.currentPage - 2 + index),
          '...',
          this.totalPages
        ]
      }
    }
  },
  methods: {
    search() {
      this.getList()
    },
    getList() {
      //ajax调用 获取数据
    },
    gotoPage(pageNumber) {
      if (!pageNumber || pageNumber < 1) {
        this.currentPage = 1
      } else if (pageNumber > this.totalPages) {
        this.currentPage = this.totalPages
      } else {
        this.currentPage = pageNumber
      }

      this.getList()
    },
  }
}
</script>

4.2 完善功能

通过上述代码实现了使用复杂搜索条件获取服务器端数据,并实现跳转到指定页码的功能。但该示例中页面渲染、分页组件的表现形式可以根据自己的需求进行二次开发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue分页组件实现过程详解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 一文教会你如何搭建vue+springboot项目

    一文教会你如何搭建Vue + Spring Boot 项目 本文将详细讲解如何使用Vue.js和Spring Boot搭建一个全栈Web应用程序。我们将从创建项目开始,一步步地进行讲解,涵盖前端和后端两个方面,最终将两者结合起来,搭建完成一个完整的应用程序。 准备工作 在开始之前,确保您已经安装了以下工具或软件: 最新的Node.js 最新的Java JDK…

    Vue 2023年5月28日
    00
  • Vue 项目分环境打包的方法示例

    下面我将详细讲解怎样进行 Vue 项目分环境打包。 什么是分环境打包? 在开发 Vue 项目的过程中,我们会遇到需要在不同的环境中部署和使用同一个项目的情况,例如在本地开发环境中使用 mock 数据,而在测试或生产环境中连接真实的后端 API。 分环境打包是指在不同的环境中,使用不同的配置信息来打出不同的包。每个环境都会有自己独立的一组配置信息,随着环境的不…

    Vue 2023年5月28日
    00
  • vue实现数字动态翻牌的效果(开箱即用)

    下面是详细讲解“vue实现数字动态翻牌的效果(开箱即用)”的完整攻略: 背景 数字翻牌是一种常见的数字展示方式,适用于数字金融类、计数器、抽奖等场景。在这里我们将使用Vue.js实现数字动态翻牌的效果。 实现思路 数字动态翻牌的效果主要要用到CSS3动画和Vue动态绑定数据。首先需要用CSS3设置数字的动态翻牌效果,在Vue中通过监听数据变化来触发数字动态翻…

    Vue 2023年5月27日
    00
  • Vue自定义指令深入探讨实现

    Vue自定义指令深入探讨实现 什么是Vue自定义指令 Vue自定义指令是Vue框架中的一项重要功能,可以通过它对DOM元素进行自定义操作。Vue的内置指令有很多种,比如v-if、v-for、v-bind等等。而自定义指令则提供了更加灵活的操作方式。 Vue自定义指令实现 Vue提供的自定义指令实现方式非常简单。我们只需要使用Vue.directive()方法…

    Vue 2023年5月28日
    00
  • gojs实现蚂蚁线动画效果

    为了实现蚂蚁线动画效果,可以使用gojs库中的动画和数据模型功能。下面是实现该效果的完整攻略: 创建GoJS图表数据模型 蚂蚁线动画效果需要使用GoJS的Layout模块。在Layout模块的输入上,需要创建一个数据模型,以描述要排列的节点及它们之间的连接关系。数据模型可以由JSON对象创建,包含节点和联系人数组。示例: var data = { nodeD…

    Vue 2023年5月28日
    00
  • 解决vue addRoutes不生效问题

    解决 Vue addRoutes 不生效问题 在 Vue 动态添加路由时,如果使用了 addRoutes 方法,可能会遇到路由不生效的问题。这种情况一般出现在使用了路由懒加载的情况下,因为路由懒加载会生成异步组件,而 addRoutes 只针对同步组件进行路由添加。下面是解决这个问题的步骤。 步骤一:重置路由表 在动态路由添加前,需要先重置 router 的…

    Vue 2023年5月27日
    00
  • Vue之文件加载执行全流程

    当浏览器加载Vue文件时,需要经过文件加载、解释和执行的过程,以下是Vue之文件加载执行全流程的攻略: 文件加载 首先,浏览器会从服务器端请求Vue文件。如果该Vue文件在浏览器缓存中已经存在,则浏览器直接从缓存中读取该文件,否则,浏览器会向服务器端请求该文件。 当Web服务器收到浏览器的Vue文件请求后,会将该文件返回给浏览器。浏览器接收到Vue文件后,会…

    Vue 2023年5月27日
    00
  • Vue-CLI3.x 自动部署项目至服务器的方法步骤

    Vue-CLI3.x 自动部署项目至服务器的方法步骤 Vue-CLI3.x 是一个官方发布的 Vue.js 项目脚手架工具,它能够快速创建一个基于 Vue.js 的项目,并提供了非常方便的开发工具。在使用 Vue-CLI3.x 进行开发过程中,为了能够让我们的项目能够在服务器上运行,需要对项目进行自动部署。本文将为大家介绍基于 Git、NodeJS、PM2 …

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部