TIL 24.11.13

์œค์ง€ยท2024๋…„ 11์›” 13์ผ
post-thumbnail

๐Ÿ“š TIL

ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์‹œ์ž‘

๋‚˜๋Š” ๋…ธ์…˜ ํด๋กœ๋‹ ํ”„๋กœ์ ํŠธ์—์„œ ์—๋””ํ„ฐ ๋ถ€๋ถ„์„ ๋งก์•˜๋‹ค. ํŒ€์›๋ถ„์ด API ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด ์ฃผ์…”์„œ ๊ทธ๊ฑธ ์ด์šฉํ•ด ๋ดค๋Š”๋ฐ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊น”๋”ํ•ด์กŒ๋‹ค! ๋ชจ๋“ˆ์ด ์š”๋Ÿฐ ๊ฑฐ๊ตฌ๋‚˜ ๋ฐฐ์› ์Œ

๊ธฐ๋Šฅ ๊ตฌํ˜„

  1. ์‚ญ์ œ ๊ธฐ๋Šฅ - ์—๋””ํ„ฐ ๋ถ€๋ถ„์—์„œ ํœด์ง€ํ†ต์„ ๋ˆŒ๋ €์„ ๋•Œ ์‚ญ์ œ๋จ!
import { request } from "../../api/api.js";

const deleteBtn = document.querySelector(".deleteBtn");

const deletePost = (e) => {
  e.preventDefault();
  // documentId ๋ฐ›์•„์˜ค๊ธฐ
  const currentUrl = window.location.href;
  const documentId = currentUrl.split("/").pop();
  // ํ•ด๋‹น id ์‚ญ์ œ
  request({ method: "DELETE" }, documentId);
};

deleteBtn.addEventListener("click", deletePost);
  1. ์—๋””ํ„ฐ ์ƒ๋‹จ ๊ฒฝ๋กœ ํ‘œ์‹œ
import { request } from "../../api/api.js";

const breadCrumbCon = document.querySelector(".breadCrumb");

// api ๋ฐ์ดํ„ฐ
const postData = await request({ method: "GET" });
// console.log(postData);

//data ๊ฒฝ๋กœ ํƒ์ƒ‰
function findId(postData, targetId, path = []) {
  for (const post of postData) {
    // ํƒˆ์ถœ ์กฐ๊ฑด: ํ˜„์žฌ ๋ฐ์ดํ„ฐ์˜ id๊ฐ€ ๋ชฉํ‘œ id์™€ ์ผ์น˜ํ•˜๋ฉด ํƒ€์ดํ‹€ ๋ฐ˜ํ™˜
    if (post.id === targetId) return [...path, post.title];

    // documents ๋ฐฐ์—ด ํƒ์ƒ‰ํ•˜์—ฌ ์žฌ๊ท€ ํ˜ธ์ถœ
    if (post.documents) {
      const result = findId(post.documents, targetId, [...path, post.title]);
      if (result) return result; // ๋ชฉํ‘œ ID๋ฅผ ์ฐพ์œผ๋ฉด ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
    }
  }
  return null; // ๋ชฉํ‘œ๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ
}

//๋ฐฐ์—ด๊ฐ’ 3๊ฐœ๋งŒ ๊ฐ€์ ธ์™€์„œ ํ‘œ์‹œ
const pathTitle = () => {
  const path = findId(postData, 140046);
  if (path.length === 1) { return path; }
  else {
    return path
      .slice(-3)
      .map(v => {
        return v.length > 7 ? `${v.slice(0, 7)}...` : v;
      });
  }
};

//dom์— ํ‘œ์‹œ
let breadCrumbInner = `<ul>`;
pathTitle().forEach(title => {
  breadCrumbInner += `<li><a>${title}</a></li>`;
});
breadCrumbInner += `</ul>`;

breadCrumbCon.innerHTML = breadCrumbInner;

๊ฒฝ๋กœ / ํ‘œ์‹œ๋Š” ์–ด๋–ป๊ฒŒ ํ• ๊นŒ ํ•˜๋‹ค๊ฐ€ css ์„ ํƒ์ž๋ฅผ ํ™œ์šฉํ–ˆ๋‹ค

.breadCrumb > li:not(:last-child)::after {
  content: " /";
  margin-left: 9px;
}
  1. ๊ฒŒ์‹œ๋ฌผ ์‚ญ์ œ
  • deleteBtn ์š”์†Œ์— ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€
  • deletePost ํ•จ์ˆ˜๋กœ ํ˜„์žฌ URL์—์„œ documentId ์ถ”์ถœ
  • ์ถ”์ถœ๋œ documentId๋กœ DELETE ์š”์ฒญ ๋ณด๋‚ด ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ ์‚ญ์ œ
  1. ์ƒ๋‹จ ๊ฒฝ๋กœ(breadcrumb) ํ‘œ์‹œ
  • request ํ•จ์ˆ˜๋กœ GET ์š”์ฒญํ•˜์—ฌ postData ๊ฐ€์ ธ์˜ด
  • findId ํ•จ์ˆ˜๋กœ postData๋ฅผ ์žฌ๊ท€์  ํƒ์ƒ‰ํ•˜์—ฌ ํŠน์ • ID์˜ ๊ฒฝ๋กœ ์ฐพ์Œ
  • pathTitle ํ•จ์ˆ˜๋กœ ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ์ตœ๋Œ€ 3๊ฐœ๊นŒ์ง€ ๊ฐ€์ ธ์™€ ํ‘œ์‹œ
  • ๊ฐ ๊ฒฝ๋กœ ํ•ญ๋ชฉ์€ 7์ž ์ดˆ๊ณผ ์‹œ ๋ง์ค„์ž„ํ‘œ๋กœ ์ฒ˜๋ฆฌ
  • breadCrumbInner์— HTML ํ˜•ํƒœ๋กœ ๊ฒฝ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ํ™”๋ฉด์— ํ‘œ์‹œ

๐Ÿ’ฌ ๋งˆ์น˜๋ฉฐ

์ข…์ผ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•œ ํ•˜๋ฃจ^.^ ๊นƒํ—ˆ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์„œ zip์œผ๋กœ ์ฃผ๊ณ ๋ฐ›์•˜๋Š”๋ฐ ์ด๊ฒŒ ๋งž๋‚˜...? ์‹ถ์—ˆ๋‹ค. ๋ฐฉ๊ธˆ ์ „์— ๋‚ด๊ฐ€ ๋ญ˜ ์ˆ˜์ •ํ•˜๊ณ  ๋„˜๊ธด ๊ฑด์ง€๋„ ๊ธฐ์–ต์ด ์•ˆ ๋‚˜๋Š” ํ˜„์ƒ... ๊นƒํ—ˆ๋ธŒ์˜ ์†Œ์ค‘ํ•จ์„ ์•Œ๊ฒŒ ๋๋‹ค. ๋งค๋ฒˆ ํ—ท๊ฐˆ๋ ธ๋˜ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜๋‹ค.

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ณต๋ถ€ ๊ธฐ๋ก ์•„์นด์ด๋น™๐Ÿ

0๊ฐœ์˜ ๋Œ“๊ธ€