<template>
<div>
<h1>게시판</h1>
<b-table striped hover :items="sortedData" :fields="fields"></b-table>
</div>
</template>
<script>
import data from '@/data'
export default {
name:"Board",
data() {
return {
fields:[
{
key:'content_id',
label:'글번호'
},
{
key:'title',
label:'제목'
},
{
key:'created_at',
label:'작성일'
},
],
}
},
computed:{
sortedData(){
return data.Content.sort((a,b) => {return b.content_id - a.content_id});
}
}
}
</script>
// 문자 정렬
var fruites = ['orange', 'apple', 'banana'];
fruites.sort(); //(3) ['apple', 'banana', 'orange']
//숫자 정렬
var score = [4,1,6,8,3];
//오름차순
score.sort(function(a,b){
return a-b;//[1,3,4,6,8]
})
//내림차순
score.sort(function(a,b){
return b-a;//[8,6,4,3,1]
})
0: {content_id: 3, user_id: 2, title: 'css library 뭐가 제일 좋나요?', context: 'ㅈㄱㄴ', created_at: '2019-03-29 13:11:42', …}
1: {content_id: 2, user_id: 3, title: 'react 공부하고싶어요', context: 'react 궁금해요오오', created_at: '2019-01-02 13:11:42', …}
2: {content_id: 1, user_id: 1, title: '안녕하세요', context: '하하하하핳', created_at: '2019-01-01 13:11:42', …}
위는 data의 배열 요소들이며 content_id의 index로 배열을 재정렬하고 싶다면 아래와 같이 원하는 프로퍼티 키로 반환해주면 된다.
data.sort(function(a,b){
return b.content_id - a.content_id;
})
<template>
<div>
<h1>게시판</h1>
<b-table striped hover :items="getData" :fields="fields" @row-clicked="rowClick"></b-table>
<b-button @click="create">작성하기</b-button>
</div>
</template>
<script>
import data from '@/data';
export default {
name:"Board",
data() {
return {
fields:[
{
key:'content_id',
label:'글번호'
},
{
key:'title',
label:'제목'
},
{
key:'created_at',
label:'작성일'
},
{
key:'user_name',
label:'글쓴이'
},
],
}
},
computed:{
getData(){
let items = data.Content.sort((a,b)=>{return b.content_id - a.content_id})
items = items.map(contentItem => {
return {...contentItem, user_name:data.User.filter(userItem => userItem.user_id === contentItem.user_id)[0].name}
})
return items;
}
},
methods:{
rowClick(item, index, e){
this.$router.push({
name:'Detail',
params:{contentId : item.content_id}
})
},
create(){
this.$router.push({
name:"Create"
})
}
}
}
</script>
<b-table>
태그로 테이블이 생성되기 때문에 각 row에 대한 click 이벤트를 어디에 줘야할지 난감했다. 해결 방법은 @row-clicked
, 각 row에 대한 데이터와 Index, event까지 자동으로 가져와준다.인자
<template>
<div>
<h1>게시판</h1>
<b-table striped hover :items="getData" :fields="fields" @row-clicked="rowClick"></b-table>
</div>
</template>
<script>
import data from '@/data';
export default {
name:"Board",
data() {
return {
fields:[
{
key:'content_id',
label:'글번호'
},
{
key:'title',
label:'제목'
},
{
key:'created_at',
label:'작성일'
},
{
key:'user_name',
label:'글쓴이'
},
],
}
},
computed:{
getData(){
let items = data.Content.sort((a,b)=>{return b.content_id - a.content_id})
items = items.map(contentItem => {return {...contentItem, user_name:data.User.filter(userItem => userItem.user_id === contentItem.user_id)[0].name}})
return items;
}
},
methods:{
rowClick(item, index, e){
this.$router.push({
name:'Detail',
params:{contentId : item.content_id}
})
}
}
}
</script>
<template>
<div>
<b-card>
<div class="content-detail-content-info">
<div class="content-detail-content-info-left">
<div class="content-detail-content-info-left-number">
{{contentId}}
</div>
<div class="content-detail-content-info-left-subject">
{{title}}
</div>
</div>
<div class="content-detail-content-info-right">
<div class="content-detail-content-info-right-user">
글쓴이: {{user}}
</div>
<div class="content-detail-content-info-right-created">
등록일: {{created}}
</div>
</div>
</div>
<div class="content-detail-content">
{{context}}
</div>
<div class="content-detail-button">
<!-- <b-button variant="primary" @click="updateData">수정</b-button> -->
<b-button variant="success" @click="deleteData">삭제</b-button>
</div>
<div class="content-detail-comment">
덧글
</div>
</b-card>
</div>
</template>
<script>
import data from "@/data";
export default {
name: "ContentDetail",
data() {
//[1] 해당 라우터의 파라미터에서 contentId를 추출.
const contentId = Number(this.$route.params.contentId);
//[2] 데이터베이스에서 해당 contentId와 일치하는 데이터를 filter 메서드를 통해 들고온다. filter로 데이터를 들고오면 array 형태기 때문에 첫번째 뎁스까지 들어가줘야한다.
const contentData = data.Content.filter(item => item.content_id === contentId)[0]
return {
contentId: contentId,
title: contentData.title,
context: contentData.context,
user: data.User.filter(item => item.user_id === contentData.user_id)[0]
.name,
created: contentData.created_at
};
},
};
</script>
findIndex
/splice
)findIndex
메서드가 유용 ! deleteData(){
const deleteDataId = data.Content.findIndex(item => item.content_id === this.contentId);
data.Content.splice(deleteDataId,1);
this.$router.push({
path:"/board/free"
})
}
<template>
<div>
<b-input v-model="subject" placeholder="제목을 입력해 주세요"></b-input>
<b-textarea
v-model="context"
placeholder="내용을 입력해 주세요"
rows="3"
max-rows="6"
></b-textarea>
<b-button @click="uploadContent">저장</b-button>
<b-button @click="cancle">취소</b-button>
</div>
</template>
<script>
import data from "@/data"
export default {
name:"Create",
data(){
const contentId = this.$route.params.contentId;
const contentData = data.Content.filter(item => item.content_Id === contentId);
return{
contentId:contentId,
contentData:contentData,
subject: '',
context:'',
userId:1,
created_at:'2022-11-22 11:33:22',
updated_at :null
}
},
methods:{
cancle(){
this.$router.push({
name:'Board'
})
},
uploadContent(){
let items = data.Content.sort((a,b) => {return b.content_id - a.content_id});
const content_id = items[0].content_id +1;
data.Content.push(
{
content_id: content_id,
user_id: this.userId,
title: this.subject,
context: this.context,
created_at: this.getCreatedAt(),
updated_at: null,
}
)
this.$router.push({
name:'Board'
})
},
getCreatedAt(){
const today = new Date();
const year = today.getFullYear();
const month = today.getMonth() + 1;
const date = today.getDate();
const hour = today.getHours();
const minute = today.getMinutes();
const second = today.getSeconds();
return `${year}-${month}-${date} ${hour}:${minute}:${second}`
}
},
}
</script>
https://dudmy.net/javascript/2015/11/16/javascript-sort/
https://www.youtube.com/watch?v=sUFlKau4ELk&list=PLyjjOwsFAe8ITIDUNsU_x4XNbPJeOvs-b&index=7