<script>
export default {
name: "PostList",
data() {
return {
posts: [], // 기사 객체 담을 배열
page: 1, // 불러올 API page
blogNum: 16 // 불러올 데이터 개수
};
},
created() {},
methods: {
infiniteHandler($state) {
// 기사 데이터
let post = function(
index,
imageUrl,
postUrl,
title,
author,
authorThumbnailUrl,
writtenOn
) {
this.index = index;
this.imageUrl = imageUrl;
this.postUrl = postUrl;
this.title = title;
this.author = author;
this.authorThumbnailUrl = authorThumbnailUrl;
this.writtenOn = writtenOn;
};
// 해상도에 따라 데이터 불러오는 개수를 다르게 함
if (window.innerWidth >= 1024 && window.innerWidth <= 1279) {
this.blogNum = 9;
} else if (window.innerWidth < 1024) this.blogNum = 4;
let request = new Request(
`/wp-json/wp/v2/posts?tags=4690&per_page=` +
this.blogNum +
`&page=` +
this.page +
`&_embed`
);
// 디코더 함수
const decoder = function(str) {
return str.replace(/&#(\d+);/g, function(match, dec) {
return String.fromCharCode(dec);
});
};
// API 데이터 전체
async function fetching() {
return fetch(request)
.then(function(response) {
if (!response.ok) {
throw response;
}
return response.json();
})
.catch(function(error) {
console.log(error);
// 더 이상 데이터가 없을 시 로딩 종료
$state.complete();
});
}
// posts에 post 객체 넣는 함수
async function pusher(post, posts) {
posts.push(post);
return posts;
}
// 각 데이터 post에 저장하는 함수
async function makeBlogData(idx, devIoJson) {
// 기사 index 0번부터 최신
post.index = idx;
// 순회하여 돌 아이템
if (devIoJson[post.index] == null) { // 데이터가 없다면 로딩 종료
await $state.complete();
return false;
}
let embedded = devIoJson[post.index]._embedded;
// 썸네일
if (embedded["wp:featuredmedia"] != null) {
post.imageUrl = embedded["wp:featuredmedia"]["0"].source_url;
} else
post.imageUrl =
"/wp-content/uploads/2018/11_1200x630.jpeg";
// 실제 기사 링크
post.postUrl = devIoJson[post.index].link;
// 제목
post.title = decoder(devIoJson[post.index].title.rendered);
// 작성자 이름
post.author = embedded.author["0"].name;
// 작성자 아이콘 썸네일
post.authorThumbnailUrl = embedded.author["0"].avatar_urls["24"];
// 작성 날짜
post.writtenOn = devIoJson[post.index].date.substring(0, 10);
// 객체 생성
let postData = new post(
post.index,
post.imageUrl,
post.postUrl,
post.title,
post.author,
post.authorThumbnailUrl,
post.writtenOn
);
return postData;
}
// 블로그 리스트 만드는 함수
async function postMaker(posts, blogNum) {
let devIoJson = await fetching();
for (let index = 0; index < blogNum; index++) {
let blog = await makeBlogData(index, devIoJson);
if (blog == false) return;
await pusher(blog, posts);
}
}
// 무한 스크롤 로딩 함수
async function loader(posts, page, blogNum) {
await postMaker(posts, blogNum);
await $state.loaded();
}
// 로딩 함수 실행
loader(this.posts, ++this.page, this.blogNum);
}
}
};
PHNjcmlwdD4KZXhwb3J0IGRlZmF1bHQgewogIG5hbWU6ICJQb3N0TGlzdCIsCiAgZGF0YSgpIHsKICAgIHJldHVybiB7CiAgICAgIHBvc3RzOiBbXSwgICAgLy8g6riw7IKsIOqwneyytCDri7TsnYQg67Cw7Je0CiAgICAgIHBhZ2U6IDEsICAgICAgLy8g67aI65+s7JisIEFQSSBwYWdlCiAgICAgIGJsb2dOdW06IDE2ICAgLy8g67aI65+s7JisIOuNsOydtO2EsCDqsJzsiJgKICAgIH07CiAgfSwKICBjcmVhdGVkKCkge30sCiAgbWV0aG9kczogewogICAgaW5maW5pdGVIYW5kbGVyKCRzdGF0ZSkgewogICAgICAgIC8vIOq4sOyCrCDrjbDsnbTthLAKICAgICAgICBsZXQgcG9zdCA9IGZ1bmN0aW9uKAogICAgICAgIGluZGV4LAogICAgICAgIGltYWdlVXJsLAogICAgICAgIHBvc3RVcmwsCiAgICAgICAgdGl0bGUsCiAgICAgICAgYXV0aG9yLAogICAgICAgIGF1dGhvclRodW1ibmFpbFVybCwKICAgICAgICB3cml0dGVuT24KICAgICAgKSB7CiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwogICAgICAgIHRoaXMuaW1hZ2VVcmwgPSBpbWFnZVVybDsKICAgICAgICB0aGlzLnBvc3RVcmwgPSBwb3N0VXJsOwogICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKICAgICAgICB0aGlzLmF1dGhvciA9IGF1dGhvcjsKICAgICAgICB0aGlzLmF1dGhvclRodW1ibmFpbFVybCA9IGF1dGhvclRodW1ibmFpbFVybDsKICAgICAgICB0aGlzLndyaXR0ZW5PbiA9IHdyaXR0ZW5PbjsKICAgICAgfTsKICAgICAgLy8g7ZW07IOB64+E7JeQIOuUsOudvCDrjbDsnbTthLAg67aI65+s7Jik64qUIOqwnOyImOulvCDri6TrpbTqsowg7ZWoCiAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA+PSAxMDI0ICYmIHdpbmRvdy5pbm5lcldpZHRoIDw9IDEyNzkpIHsKICAgICAgICB0aGlzLmJsb2dOdW0gPSA5OwogICAgICB9IGVsc2UgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgMTAyNCkgdGhpcy5ibG9nTnVtID0gNDsKICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCgKICAgICAgICBgL3dwLWpzb24vd3AvdjIvcG9zdHM/dGFncz00NjkwJnBlcl9wYWdlPWAgKwogICAgICAgICAgdGhpcy5ibG9nTnVtICsKICAgICAgICAgIGAmcGFnZT1gICsKICAgICAgICAgIHRoaXMucGFnZSArCiAgICAgICAgICBgJl9lbWJlZGAKICAgICAgKTsKICAgICAgLy8g65SU7L2U642UIO2VqOyImAogICAgICBjb25zdCBkZWNvZGVyID0gZnVuY3Rpb24oc3RyKSB7CiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8mIyhcZCspOy9nLCBmdW5jdGlvbihtYXRjaCwgZGVjKSB7CiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShkZWMpOwogICAgICAgIH0pOwogICAgICB9OwogICAgICAvLyBBUEkg642w7J207YSwIOyghOyytAogICAgICBhc3luYyBmdW5jdGlvbiBmZXRjaGluZygpIHsKICAgICAgICByZXR1cm4gZmV0Y2gocmVxdWVzdCkKICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgICAgICAgICB0aHJvdyByZXNwb25zZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpOwogICAgICAgICAgfSkKICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikgewogICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7CiAgICAgICAgICAgIC8vIOuNlCDsnbTsg4Eg642w7J207YSw6rCAIOyXhuydhCDsi5wg66Gc65SpIOyiheujjAogICAgICAgICAgICAkc3RhdGUuY29tcGxldGUoKTsKICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIC8vIHBvc3Rz7JeQIHBvc3Qg6rCd7LK0IOuEo+uKlCDtlajsiJgKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVzaGVyKHBvc3QsIHBvc3RzKSB7CiAgICAgICAgcG9zdHMucHVzaChwb3N0KTsKICAgICAgICByZXR1cm4gcG9zdHM7CiAgICAgIH0KICAgICAgLy8g6rCBIOuNsOydtO2EsCBwb3N07JeQIOyggOyepe2VmOuKlCDtlajsiJgKICAgICAgYXN5bmMgZnVuY3Rpb24gbWFrZUJsb2dEYXRhKGlkeCwgZGV2SW9Kc29uKSB7CiAgICAgICAgLy8g6riw7IKsIGluZGV4IDDrsojrtoDthLAg7LWc7IugCiAgICAgICAgcG9zdC5pbmRleCA9IGlkeDsKICAgICAgICAvLyDsiJztmoztlZjsl6wg64+MIOyVhOydtO2FnAogICAgICAgIGlmIChkZXZJb0pzb25bcG9zdC5pbmRleF0gPT0gbnVsbCkgeyAvLyDrjbDsnbTthLDqsIAg7JeG64uk66m0IOuhnOuUqSDsooXro4wKICAgICAgICAgIGF3YWl0ICRzdGF0ZS5jb21wbGV0ZSgpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBsZXQgZW1iZWRkZWQgPSBkZXZJb0pzb25bcG9zdC5pbmRleF0uX2VtYmVkZGVkOwogICAgICAgIC8vIOyNuOuEpOydvAogICAgICAgIGlmIChlbWJlZGRlZFsid3A6ZmVhdHVyZWRtZWRpYSJdICE9IG51bGwpIHsKICAgICAgICAgIHBvc3QuaW1hZ2VVcmwgPSBlbWJlZGRlZFsid3A6ZmVhdHVyZWRtZWRpYSJdWyIwIl0uc291cmNlX3VybDsKICAgICAgICB9IGVsc2UKICAgICAgICAgIHBvc3QuaW1hZ2VVcmwgPQogICAgICAgICAgICAiL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE4LzExXzEyMDB4NjMwLmpwZWciOwogICAgICAgIC8vIOyLpOygnCDquLDsgqwg66eB7YGsCiAgICAgICAgcG9zdC5wb3N0VXJsID0gZGV2SW9Kc29uW3Bvc3QuaW5kZXhdLmxpbms7CiAgICAgICAgLy8g7KCc66qpCiAgICAgICAgcG9zdC50aXRsZSA9IGRlY29kZXIoZGV2SW9Kc29uW3Bvc3QuaW5kZXhdLnRpdGxlLnJlbmRlcmVkKTsKICAgICAgICAvLyDsnpHshLHsnpAg7J2066aECiAgICAgICAgcG9zdC5hdXRob3IgPSBlbWJlZGRlZC5hdXRob3JbIjAiXS5uYW1lOwogICAgICAgIC8vIOyekeyEseyekCDslYTsnbTsvZgg7I2464Sk7J28CiAgICAgICAgcG9zdC5hdXRob3JUaHVtYm5haWxVcmwgPSBlbWJlZGRlZC5hdXRob3JbIjAiXS5hdmF0YXJfdXJsc1siMjQiXTsKICAgICAgICAvLyDsnpHshLEg64Kg7KecCiAgICAgICAgcG9zdC53cml0dGVuT24gPSBkZXZJb0pzb25bcG9zdC5pbmRleF0uZGF0ZS5zdWJzdHJpbmcoMCwgMTApOwogICAgICAgIC8vIOqwneyytCDsg53shLEKICAgICAgICBsZXQgcG9zdERhdGEgPSBuZXcgcG9zdCgKICAgICAgICAgIHBvc3QuaW5kZXgsCiAgICAgICAgICBwb3N0LmltYWdlVXJsLAogICAgICAgICAgcG9zdC5wb3N0VXJsLAogICAgICAgICAgcG9zdC50aXRsZSwKICAgICAgICAgIHBvc3QuYXV0aG9yLAogICAgICAgICAgcG9zdC5hdXRob3JUaHVtYm5haWxVcmwsCiAgICAgICAgICBwb3N0LndyaXR0ZW5PbgogICAgICAgICk7CiAgICAgICAgcmV0dXJuIHBvc3REYXRhOwogICAgICB9CiAgICAgIC8vIOu4lOuhnOq3uCDrpqzsiqTtirgg66eM65Oc64qUIO2VqOyImAogICAgICBhc3luYyBmdW5jdGlvbiBwb3N0TWFrZXIocG9zdHMsIGJsb2dOdW0pIHsKICAgICAgICBsZXQgZGV2SW9Kc29uID0gYXdhaXQgZmV0Y2hpbmcoKTsKICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYmxvZ051bTsgaW5kZXgrKykgewogICAgICAgICAgbGV0IGJsb2cgPSBhd2FpdCBtYWtlQmxvZ0RhdGEoaW5kZXgsIGRldklvSnNvbik7CiAgICAgICAgICBpZiAoYmxvZyA9PSBmYWxzZSkgcmV0dXJuOwogICAgICAgICAgYXdhaXQgcHVzaGVyKGJsb2csIHBvc3RzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8g66y07ZWcIOyKpO2BrOuhpCDroZzrlKkg7ZWo7IiYCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWRlcihwb3N0cywgcGFnZSwgYmxvZ051bSkgewogICAgICAgIGF3YWl0IHBvc3RNYWtlcihwb3N0cywgYmxvZ051bSk7CiAgICAgICAgYXdhaXQgJHN0YXRlLmxvYWRlZCgpOwogICAgICB9CiAgICAgIC8vIOuhnOuUqSDtlajsiJgg7Iuk7ZaJCiAgICAgIGxvYWRlcih0aGlzLnBvc3RzLCArK3RoaXMucGFnZSwgdGhpcy5ibG9nTnVtKTsKICAgIH0KICB9Cn07Cg==