250x250
Notice
Recent Posts
Recent Comments
«   2025/01   »
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
Tags
more
Archives
Today
Total
관리 메뉴

진스

vue 로 만든 간단한 게시판 본문

Vue

vue 로 만든 간단한 게시판

입방정 2021. 4. 27. 17:19
728x90

참고 :codesandbox.io/s/gandanhan-gesipan-gq5mn

 

간단한 게시판 - CodeSandbox

간단한 게시판 by baejm using @vue/cli-plugin-babel, axios, vue

codesandbox.io

 

vue 게시판

 

상위 컴포넌트 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,
      default3 //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
Comments