index.html
css
@charset"UTF-8";
a { color: #5398ff; }
body { font-family: Verdana, Geneva, Tahoma, sans-serif; display: flex; justify-content: center; background: #eee; }
.container { width: 550px; padding: 3rem 2rem; }
.feed { display: flex; flex-direction: column; row-gap: 2rem; }
h1 { text-align: center; padding-bottom: 2rem; }
h2 { white-space: nowrap; }
.post,.profile { background: #fff; padding: 2rem; border-radius: 15px; box-shadow: 0 10px 10px -10px rgba(0, 0, 0, 0.2); display: flex; flex-direction: column; row-gap: 1.5rem; }
.user { font-size: 1.1rem; }
.profile { align-items: center; }
.name { font-size: 1.5rem; padding-bottom: 2rem; }
html
<div class="container">
<div class="feed">
</div>
</div>
js
const feed = document.querySelector(".feed");
// 4. json์์ id๋ฅผ ๊ฐ์ง๊ณ ์ค๋ ํจ์
function getUserById(id) {
const url = `https://jsonplaceholder.typicode.com/users/${id}`;
// ๋น๋๊ธฐ
// ๊ฐ id์ ํด๋นํ๋ ์์ดํ
๋ค์ ๋ถ๋ฌ์ด
return fetch(url)
.then((response) => response.json()) // ์๋ต(๊ฒฐ๊ณผ๋ฌผ)์ json์ผ๋ก ๋ฆฌํด
.then((data) => data); // ๊ฒฐ๊ณผ๊ฐ๋ง ๋ฆฌํด
}
// 2. ๊ฐ๊ฐ์ ๊ฒ์๋ฌผ(.post)์ ๋ง๋๋ ํจ์ ์ ์
// 5. async
createPost = async(post) => {
const wrap = document.createElement("div");
const user = document.createElement("a");
const msg = document.createElement("div");
wrap.className = "post";
user.className = "user";
msg.className = "msg";
wrap.id = post.id;
user.href = "./user.html";
// user.innerText = "@user"; // ์ฐ์ ๊ณ ์ ์ผ๋ก
// 4.
// 5. await
const userInfo = await getUserById(post.userId)
console.log(userInfo);
user.innerText = `@${userInfo.username}`; // @ undefined
msg.innerText = post.body;
// 3. user์ด๋ฆ ํด๋ฆญํ ๋ ์ด๋ฒคํธ ๋ฐ์
user.addEventListener("click", () => {
localStorage.setItem("userId", post.userId); // key, value
console.log("์ ์ ์์ด๋ ์ ์ฅ", post.userId);
})
wrap.append(user, msg); // ๋ค์ชฝ์ผ๋ก ์ง์ด๋ฃ์
feed.append(wrap); // userํ์ด์ง์๋ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ํ์ด์ง ์ด๋ ์ ์ค๋ฅ ๋ฐ์
}
// userํ์ด์ง์์๋ ํ์ ์๋ ํจ์
// 1. post.jsonํ์ผ์ ๋ฐ์์ค๋ ํจ์ ์ ์
function getAllPost() {
const url = "https://jsonplaceholder.typicode.com/posts";
// ๋น๋๊ธฐ
fetch(url)
.then((response) => response.json()) // ์๋ต(๊ฒฐ๊ณผ๋ฌผ)์ json์ผ๋ก ๋ฆฌํด
.then((data) => {
// data - arrayํํ
data.forEach((post) => {
// 2. ๊ฐ๊ฐ์ ๊ฒ์๋ฌผ์ ๋ง๋๋ ํจ์ ์คํ
createPost(post);
});
});
}
// 6. feed๊ฐ ์๋ userํ์ด์ง์์๋ ์๋ํ์ง ์๊ฒ ์กฐ๊ฑด๋ฌธ ์ ์
// 1. jsonํ์ผ์ ๋ฐ์์ค๋ ํจ์ ํธ์ถ
if (feed) {
getAllPost();
}
user.js
css
@charset"UTF-8";
a { color: #5398ff; }
body { font-family: Verdana, Geneva, Tahoma, sans-serif; display: flex; justify-content: center; background: #eee; }
.container { width: 550px; padding: 3rem 2rem; }
.feed { display: flex; flex-direction: column; row-gap: 2rem; }
h1 { text-align: center; padding-bottom: 2rem; }
h2 { white-space: nowrap; }
.post,.profile { background: #fff; padding: 2rem; border-radius: 15px; box-shadow: 0 10px 10px -10px rgba(0, 0, 0, 0.2); display: flex; flex-direction: column; row-gap: 1.5rem; }
.user { font-size: 1.1rem; }
.profile { align-items: center; }
.name { font-size: 1.5rem; padding-bottom: 2rem; }
html
<div class="container">
<h1>User Profile</h1>
<div class="profile">
<h2 class="name">User Name (@username)</h2> <!-- ๋ฐ๋๋ ๋ถ๋ถ -->
<div>
<span>E-mail : </span>
<a class="email">์ด๋ฉ์ผ์ฃผ์</a>
</div>
<div>
<span>Website : </span>
<a class="website">์น์ฌ์ดํธ ์ฃผ์</a>
</div>
</div>
</div>
js
// 2. ์ ์ ํ๋กํ ์
๋ฐ์ดํธ ํจ์ ์ ์
const updateProfile = (userData) => {
const profile = document.querySelector(".profile");
let user = `
<h2 class="name">${userData.name} (@${userData.username})</h2>
<div>
<span>E-mail : </span>
<a class="email" href="mailto:${userData.email}">${userData.email}</a>
</div>
<div>
<span>Website : </span>
<a class="website" href="http://${userData.website}" target="_blank">${userData.website}</a>
</div>
`;
profile.innerHTML = user;
};
// 1. ์ ์ ํ๋กํ์ json ํ์ผ์์ ๋ฐ์์ค๋ ํจ์ ์ ์
const loadUserProfile = async () => {
const userId = localStorage.getItem("userId"); // key๊ฐ์ ํญ์ ๋ฌธ์์ด
const userInfo = await getUserById(userId); // index.js์์ ์๋ ํจ์(promise)
// console.log(userInfo);
// 2. ์ ์ ํ๋กํ ์
๋ฐ์ดํธ ํจ์ ์คํ
updateProfile(userInfo);
};
// 1. ์ ์ ํ๋กํ์ ๋ฐ์์ค๋ ํจ์ ์คํ
loadUserProfile();
์ฌ์ฉ์ ์ด๋ฆ ํด๋ฆญํ๋ฉด
user์ ์ ๋ณด๊ฐ ๋์ด