Menu

Creating a pagination component emits click events to parent

In this tutorial, we will have a look at how we can propagate events back to parent component from the child.

<template>
    <nav v-if="pageCount > 1"> 
        <ul class="pagination" v-bind:class="cssClass">
            <li class="page-item" v-bind:class="[{ 'disabled': page == 1 }]"><a class="page-link" href="#" @click="onClicked(1)" title="Go to first page" ><span class="ti-arrow-left"></span></a></li>
            <li class="page-item" v-bind:class="[{ 'active': page == i }]" v-for="i in pageCount" :key="i"><a class="page-link" href="#" @click="onClicked(i)" v-bind:title="'Go to page ' + i">{{i}}</a></li>
            <li class="page-item" v-bind:class="[{ 'disabled': page == pageCount }]"></li><a class="page-link" href="#" @click="onClicked(pageCount)" title="Go to last page"><span class="ti-arrow-right"></span></a></li>
        </ul>   
    </nav>
</template>
<script lang="ts">
import Vue from "vue";
import Component from "vue-class-component";
@Component({
  props: {
    page: Number,
    pageCount: Number,
    itemCount: Number,
    cssClass: String
  }
})
export default class PaginationComponent extends Vue {
  created() {}
  private onClicked(page: number) {
    this.$emit("click", page);
  }
}
</script>

Below is the parent component of child component.

<template>
   <div class="col-lg-12">
        <!-- any other htmls looping list-->
        <Pagination :cssClass="'justify-content-center'" :page="result.Page" :pageCount="result.PageCount" @click="onPaginationClick" ></Pagination>
   </div>
</template>
<script lang="ts">
import Vue from "vue";
import Component from "vue-class-component";
import Pagination from "../../shared/Pagination.vue";
import { userService } from "../../../services/UserService";
import { IRestResponse, IUser, PaginatedResult, IPaginatedResult } from "../../../shared/models";

@Component({
  components: {
    Pagination   
  }
})
export default class ProjectListComponent extends Vue {  
  defaultPage: number = 1;
  result: IPaginatedResult<IUser> = { ItemCount: 0, Items: [], Page: 0, PageCount: 0, PageSize: 0 };

  created() {
    this.loadData(this.defaultPage);
  }
  private loadData(page: number) {
    this.showLoading = true;
    userService
      .getPaged(page, AppSettings.PageSize)
      .then((response: IRestResponse<IPaginatedResult<IUser>>) => {
        this.showLoading = false;
        if (!response.is_error && response.content) {
          this.result = new PaginatedResult<IProject>(response.content);
        } else {
          // show error
        }
        
      })
      .catch(error => {
        // show error
      });
  }

  private onPaginationClick(page: number) {
    this.loadData(page);
  }
}
</script>

 

Leave a comment