基于Vue如何封装分页组件

我可以为你详细讲解如何基于Vue封装一个分页组件。

在Vue中,我们可以通过以下的步骤来封装一个分页组件:

1. 创建分页组件所需要的数据和属性

我们需要定义组件所需的数据和属性,例如:当前页码、总页数、每页显示数量等。

<template>
  <div>
    <ul>
      <li v-for="page in pages" :key="page">
        <!-- 这里定义每个页码的样式和相关事件 -->
      </li>
    </ul>
  </div>
</template>

<script>
  export default {
    props: {
      currentPage: {
        type: Number,
        required: true
      },
      totalPages: {
        type: Number,
        required: true
      },
      pageSize: {
        type: Number,
        required: true
      }
    },
    data() {
      return {}
    },
    computed: {
      pages() {
        /* 在这里计算生成分页的页码 */
      }
    },
    methods: {
      /* 在这里定义翻页事件的回调函数 */
    }
  }
</script>

2. 生成分页页码

我们需要计算生成分页的页码,并将页码渲染到页面中。这可以通过computed属性实现。

<template>
  <div>
    <ul>
      <li v-for="page in pages" :key="page" :class="{active: page === currentPage}">
        <a href="#" @click="goToPage(page)">{{ page }}</a>
      </li>
    </ul>
  </div>
</template>

<script>
  export default {
    props: {
      currentPage: {
        type: Number,
        required: true
      },
      totalPages: {
        type: Number,
        required: true
      },
      pageSize: {
        type: Number,
        required: true
      }
    },
    data() {
      return {}
    },
    computed: {
      pages() {
        /* 生成分页的页码 */
        const range = 3
        const pages = []
        let start = Math.max(this.currentPage - range, 1)
        let end = Math.min(this.currentPage + range, this.totalPages)
        if (start > 1) {
          pages.push('...')
        }
        for (let i = start; i <= end; i++) {
          pages.push(i)
        }
        if (end < this.totalPages) {
          pages.push('...')
        }
        return pages
      }
    },
    methods: {
      goToPage(page) {
        /* 点击页码触发的翻页事件 */
        this.$emit('page-changed', page)
      }
    }
  }
</script>

<style>
  /* 样式可以根据自己的需求进行调整 */
  ul {
    display: flex;
    justify-content: center;
    list-style: none;
  }
  li {
    margin: 0 10px;
  }
  li a {
    display: block;
    padding: 3px 8px;
    border: 1px solid #ccc;
    border-radius: 3px;
    color: #333;
    text-decoration: none;
  }
  li a:hover {
    background-color: #eee;
  }
  li.active a {
    background-color: #66b3ff;
    color: #fff;
  }
</style>

3. 在父组件中使用封装的分页组件

我们需要在父组件中使用封装的分页组件,并通过传递props属性来控制组件的行为。

<template>
  <div>
    <!-- 父组件中使用分页组件 -->
    <Pagination
      :current-page="currentPage"
      :total-pages="totalPages"
      :page-size="pageSize"
      @page-changed="handlePageChanged"
    />
  </div>
</template>

<script>
  import Pagination from './Pagination.vue'

  export default {
    components: {
      Pagination
    },
    data() {
      return {
        currentPage: 1,
        totalPages: 10,
        pageSize: 10
      }
    },
    methods: {
      handlePageChanged(page) {
        /* 处理翻页事件的回调函数 */
        this.currentPage = page
        // 调用API获取数据重新渲染页面
      }
    }
  }
</script>

下面是两个示例说明:

  1. 例1:假设我们有一个视频网站,需要实现分页加载视频列表的功能。视频列表数据通过API获取。可以根据需要在分页组件上添加加载动画等样式。
<template>
  <div>
    <ul> <!-- 列举视频列表数据 --> </ul>
    <Pagination
      :current-page="currentPage"
      :total-pages="totalPages"
      :page-size="pageSize"
      @page-changed="handlePageChanged"
    />
  </div>
</template>

<script>
  import Pagination from './Pagination.vue'
  import { loadVideoList } from './api'

  export default {
    components: {
      Pagination
    },
    data() {
      return {
        currentPage: 1,
        totalPages: 0,
        pageSize: 20,
        videoList: []
      }
    },
    async created() {
      await this.loadData()
    },
    methods: {
      async loadData() {
        const res = await loadVideoList({
          page: this.currentPage,
          pageSize: this.pageSize
        })
        this.totalPages = Math.ceil(res.totalCount / this.pageSize)
        this.videoList = res.items
      },
      async handlePageChanged(page) {
        this.currentPage = page
        await this.loadData()
      }
    }
  }
</script>
  1. 例2:假设我们有一个博客网站,需要实现文章列表的分页功能。文章列表数据通过props传递进来。
<template>
  <div>
    <ul> <!-- 列举文章列表数据 --> </ul>
    <Pagination
      :current-page="currentPage"
      :total-pages="totalPages"
      :page-size="pageSize"
      @page-changed="handlePageChanged"
    />
  </div>
</template>

<script>
  import Pagination from './Pagination.vue'

  export default {
    components: {
      Pagination
    },
    props: {
      articleList: {
        type: Array,
        required: true
      },
      pageSize: {
        type: Number,
        required: true
      }
    },
    data() {
      return {
        currentPage: 1,
        totalPages: 0,
        visibleList: []
      }
    },
    created() {
      this.loadData()
    },
    watch: {
      articleList() {
        /* 监听传入数据的变化,重新计算总页数 */
        this.totalPages = Math.ceil(this.articleList.length / this.pageSize)
        this.loadData()
      }
    },
    methods: {
      loadData() {
        /* 根据页码和每页显示数量计算要显示的文章数据 */
        const start = (this.currentPage - 1) * this.pageSize
        const end = start + this.pageSize
        this.visibleList = this.articleList.slice(start, end)
      },
      handlePageChanged(page) {
        this.currentPage = page
        this.loadData()
      }
    }
  }
</script>

以上就是基于Vue封装分页组件的完整攻略。我们可以根据自己的需要,对分页组件进行样式和功能的调整。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Vue如何封装分页组件 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • C++超详细讲解字符串类

    C++超详细讲解字符串类 什么是字符串类 字符串类是一个用于处理字符串的类。在 C++ 中,字符串类有很多种实现方式,如使用 char 数组或 string 类等。在处理字符串时,不仅要考虑字符串的长度,还要注意字符串的内存管理和优化等问题。 使用 char 数组实现字符串类 在 C++ 中,我们可以使用 char 数组实现一个字符串类。以下是一个简单的示例…

    other 2023年6月20日
    00
  • eclipse如何以指定jdk启动

    当然,我可以为您提供有关“Eclipse如何以指定JDK启动”的完整攻略,以下是详细说明: Eclipse如何以指定JDK启动 在Eclipse中,通过以下步骤以指定JDK启动: 打开Eclipse,选择“Window”菜单,然后选择“Preferences”选项。 在“Preferences”对话框中,选择Java” -> “Installed JR…

    other 2023年5月7日
    00
  • centos7.4 可远程可视化桌面安装

    下面是关于CentOS 7.4可远程可视化桌面安装的完整攻略,包括介绍、步骤和两个示例说明。 介绍 CentOS是一种基于Linux的操作系统,可以用于服务器和桌面应用程序。本文将介绍如何在CentOS 7.4上安装可远程可视化桌面,以便远程访问和管理CentOS系统。 步骤 在CentOS 7.4上安装可远程可视化桌面的步骤通常包括以下几个步骤: 安装GN…

    other 2023年5月6日
    00
  • Python获取抖音关注列表封号账号的实现代码

    获取抖音关注列表和封号账号信息的实现代码需要以下步骤: 步骤一:安装必要的Python库 在Python中获取抖音用户的信息和数据需要使用requests和json库。安装这些库: pip install requests 步骤二:获取抖音用户的数据 使用requests库发送请求到抖音的接口获取用户的数据。抖音用户数据获取方式包括通过用户ID获取或通过用户…

    other 2023年6月27日
    00
  • rest和restful以及它们之间的区别

    REST和RESTful以及它们之间的区别 REST和RESTful是Web服务中常用的两个术语,它们之间有一定的区别。本文将详细讲解REST和RESTful的概念、特点以及它们之间的区别,并提供两个示例说明。 REST的概念和特点 REST(Representational State Transfer)是一种基于HTTP协议的Web服务架构风格。它一种轻…

    other 2023年5月8日
    00
  • redis客户端连接错误 NOAUTH Authentication required

    当我们连接 Redis 客户端时,有时会遇到一个错误信息:NOAUTH Authentication required,这意味着我们的 Redis 实例已启用了认证机制,并且连接到 Redis 实例需要提供密码。以下是详细的攻略: 1. 连接 Redis 实例 使用 Redis 客户端连接 Redis 实例时,需要通过 redis-cli 命令来连接,并指定…

    other 2023年6月25日
    00
  • 如何修改vant的less样式变量

    如何修改vant的less样式变量 1. 简介 vant是一套基于Vue.js的移动端组件库,它采用了less作为样式预处理语言。通过修改vant的less样式变量,我们可以定制化组件的样式,以满足项目需求。 2. 修改vant的less样式变量的步骤 步骤一:安装vant 首先,我们需要在项目中安装vant。 npm install vant -S 步骤二…

    other 2023年6月28日
    00
  • 关于SQL Server中bit类型字段增删查改的一些事

    关于SQL Server中bit类型字段增删查改的一些事 1. 什么是bit类型字段 bit类型字段也称作布尔型,它只有两个取值,0或1,代表真或假,可以用于存储逻辑值。 2. bit类型字段的数据类型 在SQL Server中,bit类型字段属于数据类型的一种,可通过以下语法来声明bit类型字段: ColumnName bit [DEFAULT 0/1] …

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部