vue分页组件封装

本文介绍了如何在Vue.js中封装一个分页组件,包括使用父传子通信的方式通过$emit发射事件更新父组件状态,以及使用sync修饰符直接操作父组件的属性,实现页面切换时的双向数据绑定。详细展示了组件的模板、数据、计算属性和方法,以及在父组件中的监听和调用API的例子。
摘要由CSDN通过智能技术生成

vue分页组件封装

座右铭:越努力越幸运,越运动越健康。
热爱前端技术,热爱运动的(爱笑,傻傻的)这样一个人



用父传子进行封装(发射)

//封装
<template>
  <nav aria-label="Page navigation" style="text-align: center;">
    <ul class="pagination">
      <!-- 上一页 -->
      <li @click="prePage()" :class="pageNo<=1?'disabled':''">
        <a aria-label="Previous">
          <span aria-hidden="true">&laquo;</span>
        </a>
      </li>
      <!-- 遍历总页数 -->
      <li
        :class="pageNo == index ?'active':''"
        v-for="index in pages"
        :key="index"
        @click="curPage(index)"
      >
        <a>{{index}}</a>
      </li>
      <!-- 下一页 -->
      <li @click="nextPage()" :class="pageNo>=pageTotal?'disabled':''">
        <a aria-label="Next">
          <span aria-hidden="true">&raquo;</span>
        </a>
      </li>
    </ul>
  </nav>
</template>

<script>
export default {
  data() {
    return {
      curNo: 1
    };
  },
  props: ["pageTotal", "pageNo"], //父-子 pageTotal总页数  pageNo当前页
  created() {
    this.curNo = this.pageNo;  //为了避免一些错误,不让子来操作当前页
  },
  computed: {  //对页码的要求
    pages() {
      let s = this.pageNo;
      let n = this.pageTotal;
      if (n < 10) return n; //总页数小于10,不添加...
      if (s <= 5) {
        return [1, 2, 3, 4, 5, 6, 7, "...", n];
      } else if (s >= n - 5) {
        //页码大于总页数-5
        return [1, "...", n - 6, n - 5, n - 4, n - 3, n - 2, n - 1, n];
      } else {
        return [1, "...", s - 2, s - 1, s, s + 1, s + 2, "...", n];
      }
    }
  },
  methods: {
    //当前页
    curPage(i) {
       if (i == "...") return;
      this.$emit('e-child',i);
      // if (i == "...") return;
      // this.$emit("update:pageNo", i);
    },
    //上一页
    prePage() {
      if (this.pageNo > 1) {
        this.$emit('e-child',--this.curNo );
        // this.$emit("update:pageNo", --this.curNo);
      }
    },
    //下一页
    nextPage() {
      if (this.pageNo < this.pageTotal) {
        this.$emit('e-child',++this.curNo );
        // this.$emit("update:pageNo", ++this.curNo);
      }
    }
  }
};
//调用api
//例如:<Pagination  :pageTotal = "page.pageTotal"  :pageNo="page.pageNo" @e-child="getLists" />
/*需要传递的参数
*1.pageTotal  总页数
*2.pageNo  当前页
*3.接收发射过来的参数:getLists ,getLists为发送请求分页的方法
*/ 
</script>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用sync修饰符(直接操作符,不用发射)

<template>
  <nav aria-label="Page navigation" style="text-align: center;">
    <ul class="pagination">
      <!-- 上一页 -->
      <li @click="prePage()" :class="pageNo<=1?'disabled':''">
        <a aria-label="Previous">
          <span aria-hidden="true">&laquo;</span>
        </a>
      </li>
      <!-- 遍历总页数 -->
      <li
        :class="pageNo == index ?'active':''"
        v-for="index in pages"
        :key="index"
        @click="curPage(index)"
      >
        <a>{{index}}</a>
      </li>
      <!-- 下一页 -->
      <li @click="nextPage()" :class="pageNo>=pageTotal?'disabled':''">
        <a aria-label="Next">
          <span aria-hidden="true">&raquo;</span>
        </a>
      </li>
    </ul>
  </nav>
</template>

<script>
export default {
  data() {
    return {
      curNo: 1
    };
  },
  props: ["pageTotal", "pageNo"], //父-子 pageTotal总页数  pageNo当前页
  created() {
    this.curNo = this.pageNo;  //为了避免一些错误,不让子来操作当前页
  },
  computed: {  //对页码的要求
    pages() {
      let s = this.pageNo;
      let n = this.pageTotal;
      if (n < 10) return n; //总页数小于10,不添加...
      if (s <= 5) {
        return [1, 2, 3, 4, 5, 6, 7, "...", n];
      } else if (s >= n - 5) {
        //页码大于总页数-5
        return [1, "...", n - 6, n - 5, n - 4, n - 3, n - 2, n - 1, n];
      } else {
        return [1, "...", s - 2, s - 1, s, s + 1, s + 2, "...", n];
      }
    }
  },
  methods: {
    //当前页
    curPage(i) {
      //  if (i == "...") return;
      // this.$emit('e-child',i);
      if (i == "...") return;
      this.$emit("update:pageNo", i);
    },
    //上一页
    prePage() {
      if (this.pageNo > 1) {
        // this.$emit('e-child',--this.curNo );
        this.$emit("update:pageNo", --this.curNo);
      }
    },
    //下一页
    nextPage() {
      if (this.pageNo < this.pageTotal) {
        // this.$emit('e-child',++this.curNo );
        this.$emit("update:pageNo", ++this.curNo);
      }
    }
  }
};
//注意!!!!!!!父组件中监听
//使用sync修饰符封装还需要监听当前页的变化,需要新的当前页才发生变化
watch:{  //监听pageNo
    'page.pageNo'(newValue,oldValue){
    //getLists为发送请求分页的方法
      this.getLists(newValue);
    }
  },
</script>
//调用api
//例如:<Pagination  :pageTotal = "page.pageTotal"  :pageNo.sync="page.pageNo" /> 
/*需要传递的参数
*1.pageTotal  总页数
*2.pageNo  当前页 使用sync修饰符
*/ 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Vue3中封装分页组件的方法与Vue2有所不同。以下是一个基本的封装分页组件的方法: 1. 首先,在你的项目中创建一个名为`Pagination.vue`的组件文件。 2. 在`Pagination.vue`组件中,你可以使用`<template>`标签来定义组件的结构。可以使用`<div>`标签来包裹分页组件的内容,比如页码和按钮。 3. 在`<script>`标签中,你需要导入`vue`并声明组件。你可以使用`ref`来追踪当前页码,并且使用`computed`属性来计算总页数。 4. 在组件内部,你可以创建一个`methods`对象,并在其中定义一些方法来处理页码的变化。比如,你可以创建`goToPage`方法来跳转到指定的页码。 5. 最后,在`<style>`标签中,你可以定义组件的样式,如页码的颜色和按钮的样式。 在你的项目中使用这个封装分页组件的方法如下: 1. 在需要使用分页功能的组件中,使用`import`关键字导入刚刚封装的`Pagination`组件。 2. 在`components`属性中注册`Pagination`组件。 3. 在`<template>`标签中使用自定义的分页组件。可以使用`v-model`指令来双向绑定当前页码。 通过上述步骤,你就可以在Vue3中封装一个分页组件并在项目中使用了。这个组件可以提供分页功能,让用户可以方便地切换页码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基于Vue如何封装分页组件](https://download.csdn.net/download/weixin_38550605/12789728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Vue3 element-ui实现Pagination分页组件--封装分页](https://blog.csdn.net/coinisi_li/article/details/128952886)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值