๐paginate๋?
paginate๋ฅผ ์ด์ฉํ๋ฉด DB์ ๋ฑ๋ก๋์ด์๋ ํ์ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํด์ ๋ณด์ฌ์ฃผ๋ ๊ฒ ๊ฐ๋ฅํ๋ค.
๋ง์ฝ ๋ฐ์ดํฐ์์ด ๋ง๋ค๊ณ ํ๋ฉด paginate๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๋๋ ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ ๊ฐ๋ ์ฑ ์ ์ข๋ค.
๋ณดํต ๊ฒ์ํํํ์ UI๋ฅผ ๊ฐ๋ฐํ ๋ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ด๋ค.
๐กvuejs-paginate
vue.js์์ ์ฝ๊ฒ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๊ฒ ์ ๊ณตํด์ฃผ๋ npm ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๊ฐ๋จํ๊ฒ css๋ก ๋์์ธ ์ปค์คํฐ๋ง์ด์ง๋ ๊ฐ๋ฅํด์ ์ฌ์ฉํด๋ณด๊ธฐ๋ก ํ๋ค.
vuejs-paginate ์ค์นํ๊ธฐ
https://www.npmjs.com/package/vuejs-paginate
vuejs-paginate
A simple pagination component for Vue.js
www.npmjs.com
๋จผ์ ํด๋น ์ฌ์ดํธ์ ์ ์ํ์ฌ npm install ์ฝ๋๋ฅผ ๋ณต์ฌํด์ ํ๋ก์ ํธ ๊ฒฝ๋ก์ ๊ฐ์ ์ ๋ ฅํด์ฃผ์.
์ค์น ์ฝ๋
npm install vuejs-paginate --save
vuejs-paginate ํ๋ก์ ํธ์ ์ฐ๊ฒฐํ๊ธฐ
/plugins/client.js
import Vue from 'vue'
import Paginate from 'vuejs-paginate'
Vue.component('paginate', Paginate)
nuxt.config.js
module.exports = {
//...
plugins: [
{ src: '~plugins/client', ssr: false }
],
//...
};
๋จผ์ ๋ nuxt๋ฅผ ์ฌ์ฉํ๊ณ ์์ด์
pluginsํด๋์ client.js์์ ์ค์น๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์ ์ธํด์ฃผ๊ณ
ํด๋น ํ์ผ์ nuxt.config.js์์ ํด๋น ํ๋ฌ๊ทธ์ธ์ ์ฐ๊ฒฐํด์ค๋ค.
vue ์ฝ๋ ์์ฑํ๊ธฐ
/page/paginate.vue
<template>
<div>
<div>
ํ์ฌ ์ ํ๋ ํ์ด์ง : {{selectPage}}
<paginate
:page-count="pageCount"
:page-range="3"
:margin-pages="2"
:click-handler="changePage"
:prev-text="'prev'"
:next-text="'next'"
:container-class="'pagination'"
:page-class="'page-item'">
</paginate>
</div>
</div>
</template>
<script>
export default {
data() {
return{
selectPage: 1,
pageCount: 15,
}
},
methods: {
changePage: function (pageNum) {
this.selectPage = pageNum
},
}
}
</script>
๊ฒฐ๊ณผ ํ๋ฉด
ํด๋น ์ฝ๋๋ฅผ ๋ถ์ฌ ๋ฃ์ผ๋ฉด ์๋์ฒ๋ผ ํ์ด์ง ๊ธฐ๋ฅ์ ์ ์๋๋๋ ๊ฑธ ๋ณผ ์ ์๋ค.
์ฝ๋๋ ์ ์๋์ด ๋์ง๋ง CSS๋ ์ ์ ์๋ํ์ง ์๋ ๊ฒ ๋ณด์ด๋๋ฐ
๊ธฐ๋ณธ์ ์ผ๋ก vue pagination์ bootstrap.css๋ฅผ ์ด์ฉํ๋ค๊ณ ํ๋ค.
ํ์ง๋ง ์ง๊ธ ๋ด ํ๋ก์ ํธ์๋ bootstrap.css๊ฐ ์ ์ฉ๋์ด์์ง ์์์ ์คํ์ผ ์๋ ์ํ์ด๋ค.
์คํ์ผ์ ์ฐ๋ํ๊ณ ์ถ์ผ๋ฉด bootstrap์ ํ๋ก์ ํธ์ ์ฐ๋ํ๋์ง
๋ด๊ฐ ์ง์ ์์ฑํ๋์ง ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ด์ฉํ๋ฉด ๋๋ค.
vue-paginate CSS ์ ์ฉํ๊ธฐ
๋์ ๊ฒฝ์ฐ ๋ด๊ฐ ์ง์ css๋ฅผ ์์ฑํด๋ณด์๋ค.
bootstrap์ ์ฐ๋ํ๊ธฐ ์ซ์ ๋ถ์ด๋ฉด ์๋ ์ฝ๋๋ฅผ ์ ์ฉํ์.
/page/paginate.vue css ์ ์ฉ ์ฝ๋
<template>
<div>
<div>
ํ์ฌ ์ ํ๋ ํ์ด์ง : {{selectPage}}
<paginate
:page-count="pageCount"
:page-range="3"
:margin-pages="2"
:click-handler="changePage"
:prev-text="'<'"
:next-text="'>'"
:container-class="'pagination'"
:page-class="'page-item'">
</paginate>
</div>
</div>
</template>
<script>
export default {
data() {
return{
selectPage: 1,
pageCount: 15,
}
},
methods: {
changePage: function (pageNum) {
this.selectPage = pageNum
},
}
}
</script>
<style lang="css">
.pagination {
margin:24px;
}
.pagination li {
min-width:32px;
padding:2px 6px;
text-align:center;
margin:0 3px;
border-radius: 6px;
border:1px solid #eee;
color:#666;
}
.pagination li:hover {
background: #E4DBD6;
}
.page-item a {
color:#666;
text-decoration: none;
}
.pagination li.active {
background-color : #E7AA8D;
color:#fff;
}
.pagination li.active a {
color:#fff;
}
</style>
๊ฒฐ๊ณผ ํ๋ฉด
vue-paginate์ ๊ฒฝ์ฐ :container-class์ :page-item์ด๋ผ๋ ์์ฑ์ ํตํด์
์ฌ์ฉ์๊ฐ ์ง์ class๋ฅผ ์ ์ฉํ ์ ์๋ค.
์ง์ ํ class์ ๋ง์ถฐ์ ๋ด๊ฐ ์ํ๋ css๋ฅผ ์ง์ ์์ฑํ๋ฉด
์ปค์คํฐ๋ง์ด์ง์ด ๊ฐ๋ฅํ ๊ฒ๋ vue-paginate๋ง์ ์ฅ์ ์ด๋ค.