๋ถ๋ชจ ์ปดํฌ๋ํธ
<div id="main">
<!-- ์ฝ๋ ์๋ต... -->
<!--ํ์ด์ง๋ค์ด์
์ปดํฌ๋ํธ-->
<!--
props๋ก ์์ ์ปดํฌ๋ํธ๋ก ํ์ด์ง๋ค์ด์
๊ด๋ จ parameter 5๊ฐ ์ ๋ฌํ๊ณ
์์ ์ปดํฌ๋ํธ์์ @update:current-page๋ก ๋ฐ์ดํฐ(page) ์ ๋ฌ ๋ฐ์
-->
<paging-component :current-page="currentPage" :first-page="firstPage" :last-page="lastPage" :start-idx="startIdx" :end-idx="endIdx" @update:current-page="onUpdateCurrentPage"></paging-component>
</div>
<script layout:fragment="script" th:inline="javascript" type="text/javascript">
new Vue({
//element id
el: '#main',
//vue์์ ๊ด๋ฆฌํ ๋ฐ์ดํฐ
data: {
items: [], // ๋ฐ์ดํฐ ๋ชฉ๋ก
currentPage: 1, //ํ์ฌ ํ์ด์ง
firstPage: 0, //์ฒซ๋ฒ ์งธ ํ์ด์ง
lastPage: 0, //๋ง์ง๋ง ํ์ด์ง
startIdx: 0, //์ฒซ๋ฒ ์งธ ํ์ด์ง ๋ฒํธ
endIdx: 0, //๋ง์ง๋ง ํ์ด์ง ๋ฒํธ
empNm: '', //์ฌ์๋ช
},
//data๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ณ๊ฒฝํ ์์ฑ(data์ ๋ณ๊ฒฝ ๊ฐ์ง)
computed: {
//๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ
displayedItems() {
return this.items;
},
},
//vue ์ปดํฌ๋ํธ ํ๋ฉด์ ๋ ๋๋ง ๋ ์งํ ์คํ(์ปดํฌ๋ํธ์ ํ
ํ๋ฆฟ์ด DOM์ ์ถ๊ฐ/ํ๋ฉด์ ํ์๋ ์งํ)
mounted() {
//๋ฐ์ดํฐ ์กฐํ
this.fetchData();
},
methods: {
//๋ฐ์ดํฐ ์กฐํ
fetchData() {
const url = '/api/board';
//2๋ฒ ์งธ parameter(queryString)
const params = { params:
{ currentPage: this.currentPage,
empNm: this.empNm
}
};
//ajax ํธ์ถ
axios.get(url, params)
.then(function(response) {
this.items = response.data.list;
this.firstPage = response.data.paging.firstPage;
this.lastPage = response.data.paging.lastPage;
this.startIdx = response.data.paging.firstPageNo;
this.endIdx = response.data.paging.lastPageNo;
}.bind(this))
.catch(function(error) {
// ์๋ฌ ์ฒ๋ฆฌ
console.log(error);
});
},
// ํ์ด์ง ์ด๋ ์ด๋ฒคํธ ์ ์ํ(์์ ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋ฐ์ page)
onUpdateCurrentPage(page) {
this.currentPage = page;
this.fetchData(); // fetchData() ๋ฉ์๋ ์คํ
},
//๊ฒ์
search() {
this.currentPage = 1;
this.fetchData();
},
},
});
์์์ปดํฌ๋ํธ
// ํ์ด์ง ๊ด๋ จ ์ปดํฌ๋ํธ
// ๋ถ๋ชจ ์ปดํฌ๋ํธ์๊ฒ props๋ก ๋ฐ์ดํฐ ์ ๋ฌ ๋ฐ์์ ํ์ด์ง ์์~์ข
๋ฃ์ธ๋ฑ์ค ์ธํ
ํ ํ์ด์ง๋ค์ด์
์ฒ๋ฆฌ
Vue.component('paging-component', {
props: ['currentPage', 'firstPage','lastPage', 'startIdx', 'endIdx'],
computed: {
//ํ์ด์ง ๊ฐ์ ์ธํ
(์์์ธ๋ฑ์ค, ์ข
๋ฃ์ธ๋ฑ์ค๋ฅผ ๋ฐ์์ ๋์ ์ผ๋ก array ์ธํ
)
pagedArray() {
const pagedArr = [];
for (let i = this.startIdx; i <= this.endIdx; i++) {
pagedArr.push(i);
}
return pagedArr;
},
},
methods: {
movePage(page) {
//์ด๋ฒคํธ ๋ฐ์(๋ถ๋ชจ ์ปดํฌ๋ํธ์๊ฒ ๋ฐ์ดํฐ ์ ๋ฌ)
this.$emit('update:current-page', page);
},
},
//ํ์ด์ง๋ค์ด์
ํ
ํ๋ฆฟ
template: `
<div class="paging tbl-paging">
<ul class='pagination'>
<!--first-->
<li class='paginate_button page-item first'>
<button
type='button'
class='page-link'
:style="{ cursor: currentPage !== firstPage ? 'pointer' : 'default' }"
:disabled="currentPage === firstPage"
@click="movePage(firstPage)"
>
<span class='hidden'>์ฒซ ํ์ด์ง</span>
</button>
</li>
<!--prev-->
<li class='paginate_button page-item prev'>
<button
type='button'
class='page-link'
:style="{ cursor: currentPage !== firstPage ? 'pointer' : 'default' }"
:disabled="currentPage === firstPage"
@click="movePage(currentPage - 1)"
>
<span class='hidden'>์ด์ ํ์ด์ง</span>
</button>
</li>
<!--โ ~ โฉ-->
<li
class='paginate_button page-item'
v-for="(page, index) in pagedArray"
:key="index"
:class="{ 'active': currentPage === page }"
@click="movePage(page)"
>
<button type='button' class='page-link' style='cursor: pointer;'>
{{ page }}
</button>
</li>
<!--next-->
<li class='paginate_button page-item next'>
<button
type='button'
:disabled="currentPage === lastPage"
class='page-link'
:style="{ cursor: currentPage !== lastPage ? 'pointer' : 'default' }"
@click="movePage(currentPage + 1)"
>
<span class='hidden'>๋ค์ ํ์ด์ง</span>
</button>
</li>
<!--last-->
<li class='paginate_button page-item last'>
<button
type='button'
:disabled="currentPage === lastPage"
class='page-link'
:style="{ cursor: currentPage !== lastPage ? 'pointer' : 'default' }"
@click="movePage(last)"
>
<span class='hidden'>๋ง์ง๋ง ํ์ด์ง</span>
</button>
</li>
</ul>
</div>
`,
});
๋๊ธ