진스
vue 로 만든 간단한 게시판 본문
728x90
참고 :codesandbox.io/s/gandanhan-gesipan-gq5mn
상위 컴포넌트 SimplePagination.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
<template>
<div>
<h1>TABLE PAGINATION</h1>
몇 개씩 표시: <input type="number" v-model.number="divice" maxlength="6" />
<template v-if="loading">
<h1>로딩중</h1>
</template>
<paginated-list :list-array="pageArray" :page-size="divice" v-else />
<div></div>
</div>
</template>
<script>
import axios from "axios";
import PaginatedList from "./PaginatedList";
export default {
name: "simple-pagination",
components: {
PaginatedList
},
data() {
return {
pageArray: [], //담을곳
divice: 2, //기본 출력수
loading: false
};
},
async created() {
try {
this.loading = true;
const res = await axios.get("https://reqres.in/api/users?page=1");
this.pageArray = res.data.data;
this.loading = false;
return res;
} catch (err) {
console.log(err);
}
}
};
</script>
<style>
h1 {
color: #454545;
text-align: center;
}
</style>
|
cs |
하위 컴포넌트 PaginatedList.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
<template>
<div>
<table>
<tr>
<th>NO</th>
<th>Name</th>
<th>Email</th>
<th>Avatar</th>
<th>Option</th>
</tr>
<tr v-for="(p, index) in paginatedData" :key="p.no">
<td>{{ p.id }}</td>
<td>{{ p.first_name }}</td>
<td>{{ p.email }}</td>
<td><img :src="p.avatar" alt="" /></td>
<td><a href="javascript:;" @click="remove(index)">삭제</a></td>
</tr>
</table>
<div class="btn-cover">
<button :disabled="pageNum === 0" @click="prevPage" class="page-btn">
이전
</button>
<span class="page-count">{{ pageNum + 1 }} / {{ pageCount }} 페이지</span>
<button
:disabled="pageNum >= pageCount - 1"
@click="nextPage"
class="page-btn"
>
다음
</button>
</div>
</div>
</template>
<script>
export default {
name: "paginated-list",
data() {
return {
pageNum: 0 //현재페이지수 기본값은0
};
},
props: {
listArray: {
type: Array,
required: true
},
pageSize: {
type: Number,
required: false,
default: 3 //props로 내려온 값이 없으면 기본 3
}
},
methods: {
nextPage() {
this.pageNum += 1;
},
prevPage() {
this.pageNum -= 1;
},
remove(index) {
this.listArray.splice(index, 1);
}
},
computed: {
halfWidth: {
get: function() {
return this.width / 2;
},
// halfWidth를 2 배수한 숫자를 width에 할당하기
set: function(val) {
this.width = val * 2;
}
},
pageCount() {
let listLeng = this.listArray.length, //전체아이템수
listSize = this.pageSize, //원하는 출력 수
page = Math.floor(listLeng / listSize); //페이지수 = 전체아이템수/원하는출력개수
if (listLeng % listSize > 0) page += 1;
/*
아니면 page = Math.floor((listLeng - 1) / listSize) + 1;
이런식으로 if 문 없이 고칠 수도 있다!
*/
return page;
},
paginatedData() {
const start = this.pageNum * this.pageSize, //시작 = 현재페이지수*원하는 출력수
end = start + this.pageSize; //끝 = 시작 + 원하는 출력수
return this.listArray.slice(start, end);
}
}
};
</script>
<style>
table {
width: 100%;
border-collapse: collapse;
}
table th {
font-size: 1.2rem;
}
table tr {
height: 2rem;
text-align: center;
border-bottom: 1px solid #505050;
}
table tr:first-of-type {
border-top: 2px solid #404040;
}
table tr td {
padding: 1rem 0;
font-size: 1.1rem;
}
.btn-cover {
margin-top: 1.5rem;
text-align: center;
}
.btn-cover .page-btn {
width: 5rem;
height: 2rem;
letter-spacing: 0.5px;
}
.btn-cover .page-count {
padding: 0 1rem;
}
</style>
|
cs |
728x90
'Vue' 카테고리의 다른 글
Vue 참고 사이트 (0) | 2021.04.28 |
---|---|
vue 1. 입력 양식/데이터 출력/바인딩 관련 정리 (0) | 2021.04.28 |
vue 에서 슬라이더 사용하기 (vue-carousel2) (0) | 2021.04.26 |
vue css파일 임포트 할때.. (1) | 2021.04.26 |
Vue 버전업 방법 및 재설치 (0) | 2021.04.26 |
Comments