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日

相关文章

  • 理解javascript定时器中的单线程

    理解 JavaScript 定时器中的单线程 在 JavaScript 中,单线程意味着 JavaScript 只能同时执行一个任务。考虑到浏览器运行环境,并发地处理多个任务对于性能和资源管理并不是必要的。不过,这也带来很大的挑战,尤其是处理一些可能会导致 JavaScript 阻塞的任务时。 JavaScript 定时器充分展现了 JavaScript 作…

    Vue 2023年5月28日
    00
  • Vue3响应式对象Reactive和Ref的用法解读

    Vue3响应式对象Reactive和Ref的用法解读 什么是Vue3的响应式对象? Vue3中的响应式对象是指一种特殊的JavaScript对象,它可以被Vue3追踪其变化并进行响应式渲染。在Vue2中,响应式数据的实现是通过ES5提供的Object.defineProperty()方法来实现的,而在Vue3中,响应式数据的实现则是依赖于ES6中的Proxy…

    Vue 2023年5月28日
    00
  • Vue.js directive自定义指令详解

    Vue.js directive自定义指令是Vue.js框架提供的一个强大的功能,可以让我们自定义Vue实例的行为。下面我将为大家详细讲解“Vue.js directive自定义指令详解”完整攻略。 一. Vue.js directive自定义指令详解 在Vue.js中,我们可以通过Vue.directive()方法来自定义指令。该方法接收两个参数:指令的名…

    Vue 2023年5月28日
    00
  • Vue实现DOM元素拖放互换位置示例

    以下是“Vue实现DOM元素拖放互换位置”示例的完整攻略: 步骤1:安装Vue和Vue-Draggable插件 首先需要在你的项目中安装Vue和Vue-Draggable插件。Vue-Draggable是一个实现可拖动DOM元素的Vue.js组件,支持多种拖动方式。 npm install –save vue npm install –save vued…

    Vue 2023年5月27日
    00
  • Vue数据更新但页面没有更新的多种情况问题及解决

    问题描述: 在使用Vue时,我们发现有些时候,数据更新了,但页面并没有及时更新,这是一个非常常见的问题。 解决方案: 异步更新问题 当我们使用Vue异步更新数据时,如果不使用vm.$nextTick(),数据更新之后页面并不会立刻进行更新。 例如,在下面这个例子中,我们在点击按钮之后更新了msg的值,但是页面上的内容并没有更新。 <template&g…

    Vue 2023年5月27日
    00
  • 快速了解vue-cli 3.0 新特性

    快速了解vue-cli 3.0 新特性 简介 vue-cli是一个脚手架工具,用于在Vue.js项目中快速生成模板和配置文件。在Vue.js一系列项目中,vue-cli是一个非常重要的工具,对于Vue.js的开发和部署有着重要的作用。 vue-cli 3.0 新特性 vue-cli 3.0是一个全新的版本,这个版本有着重要的改进和新特性,使得用户可以更轻松的…

    Vue 2023年5月28日
    00
  • vue中的for循环以及自定义指令解读

    下面我会详细地讲解一下 “Vue中的For循环以及自定义指令解读”。 Vue中的For循环 Vue提供了v-for指令,我们可以通过它循环遍历数据列表,同时将每个元素渲染成一个view。 v-for指令可以使用 in 或 of 运算符,具体取决于对象或数组的语法。这里我们以数组为例,展示v-for如何工作。 基本用法 v-for可以通过以下方式,遍历数组: …

    Vue 2023年5月29日
    00
  • Vue 动态路由的实现详情

    下面就为大家详细讲解一下「Vue 动态路由的实现详情」。 什么是动态路由? Vue 路由是一种 URL 和组件之间的映射关系,并通过 URL 触发组件的展示。而动态路由则是在 URL 中传递参数,根据参数的不同动态匹配相应的路由。例如 /article/1 和 /article/2 都可以匹配到文章详情页路由,只不过参数不同。在 Vue 中,我们可以通过“路…

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