6.组件事件-翻页组件

一、翻页组件

// Pager.vue
<template>
  <!-- 只有总页数大于1才显示分页 -->
  <div class="pager-container" v-if="pageNumber > 1">
    <a @click="handleClick(1)" :class="{ disabled: current === 1 }">|&lt;&lt;</a>
    <a @click="handleClick(current-1)" :class="{ disabled: current === 1 }">&lt;&lt;</a>
    <a
      v-for="(n, i) in numbers"
      :key="i"
      :class="{ active: current === n }"
      >{{ n }}</a
    >
    <a @click="handleClick(current + 1)" :class="{ disabled: current === pageNumber }">&gt;&gt;</a>
    <a @click="handleClick(pageNumber)" :class="{ disabled: current === pageNumber }">&gt;&gt;|</a>
  </div>
</template>

<script>
export default {
  name: "Pager",
  props: {
    // 当前页码
    current: {
      type: Number,
      default: 1,
    },
    // 总数据量:需要进行分页的所有数据
    total: {
      type: Number,
      default: 0,
    },
    // 页容量:每页可容纳多少条数据
    limit: {
      type: Number,
      default: 10,
    },
    // 可见页码数:翻页部分展示多少个页码
    visibleNumber: {
      type: Number,
      default: 10,
    },
  },
  data() {
    return {};
  },
  computed: {
    // 最大页码 = 总的数据量/每页可以容纳的数据量
    pageNumber() {
      return Math.ceil(this.total / this.limit);
    },
    // 假设当前页码在页码显示区域的最中间,我们需要计算出显示区域最小页码a以及最大页码b,将a到b这个区间内的所有页码显示到页面上
    // 页面上显示的最小页码 = 当前页码 - 页面上能显示的页码数量/2
    visibleMin() {
      let min = this.current - Math.floor(this.visibleNumber / 2);
      if (min < 1) {
        min = 1;
      }
      return min;
    },
    // 页面上显示的最大页码 = 页面上显示的最小页码 + 可见页码数-1
    visibleMax() {
      let max = this.visibleMin + this.visibleNumber - 1;
      if (max > this.pageNumber) {
        max = this.pageNumber;
      }
      return max;
    },
    // 根据页面上能显示的最大与最小页码,确定显示区域的页码数组
    numbers() {
      let nums = [];
      for (let i = this.visibleMin; i <= this.visibleMax; i++) {
        nums.push(i);
      }
      return nums;
    },
  },
  methods: {
      handleClick(newPage) {
      if (newPage < 1) {
        newPage = 1;
      }
      if (newPage > this.pageNumber) {
        newPage = this.pageNumber;
      }
      if (newPage === this.current) {
        return;
      }
      // 抛出一个事件
      this.$emit("pageChange", newPage);
    },
  },
};
</script>

<style lang="less" scoped>
@import "~@/styles/var.less";

.pager-container {
  display: flex;
  justify-content: center;
  margin: 20px 0;
  a {
    color: @primary;
    margin: 0 8px;
    cursor: pointer;
    &.disabled {
      color: @lightWords;
      cursor: not-allowed;
    }
    &.active {
      color: @words;
      font-weight: blod;
      cursor: pointer;
    }
  }
}
</style>
// App.vue
<template>
  <div id="app">
    <Pager :total="total" :current="current" @pageChange="handlePageChange($event)"/>
  </div>
</template>

<script>
// 自动找Pager文件夹下的index文件,如果没找到则向上级找Pager.vue文件
import Pager from "./components/Pager";
export default {
  name: "App",
  components: {
    Pager,
  },
  data() {
    return {
      current: 10,
      total: 302,
    };
  },
  methods: {
    handlePageChange(newPage) {
      this.current = newPage;
      console.log("加载当前页数据");
    },
  },
};
</script>

<style>
</style>

二、组件事件总结

  1. 当子组件执行this.$emit("pageChange", newPage);时,父组件出发自定义事件pageChange,page Change事件触发之后执行事件处理函数handlePageChange($event),并用$event接受子组件传递过来的参数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值