Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
관리 메뉴

개발공부일지

Javascript - 게시판 만들기 1 본문

Javascript

Javascript - 게시판 만들기 1

보람- 2023. 7. 24. 14:51

목차

1. html에서 home 페이지 table 만들기, css

2. js로 tbody 내용 만들고 thead th의 값 넣어주기 (localStorage 활용)

3. html에서 create 페이지 만들기, css

4. js로 등록 버튼 onclick 이벤트 주기 (localStorage 활용)

5. 결과


 

 

1. html에서 home 페이지 table 만들기, css

<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>List</title>
    <link rel="stylesheet" href="public/index.css" />
  </head>
  <body>
    <div id="root">
      <div>
        <a href="./create"><button>Create</button></a>
      </div>
      <div>
        <table>
          <colgroup>
            <col class="number" />
            <col class="title" />
            <col class="user" />
            <col class="created-at" />
            <col class="views" />
            <col class="likes" />
          </colgroup>
          <thead>
            <tr>
              <th>Num</th>
              <th>Title</th>
              <th>User</th>
              <th>Created At</th>
              <th>Views</th>
              <th>Likes</th>
            </tr>
          </thead>
          <tbody id="list"></tbody>
        </table>
      </div>
    </div>
    <script src="public/index.js"></script>
  </body>
</html>

- <a>로 home과 create 를 연결시켜주기

- <colgroup>은 <table>에서 세로로 나열된 항목에 <col class=" ">를 주어 각각 다른 스타일을 적용시켜 줄 수 있음

table {
  width: 100%;
  border-collapse: collapse;
  table-layout: fixed;
}

col.number {
  width: 5%;
}
col.title {
  width: 45%;
}
col.user {
  width: 20%;
}
col.created-at {
  width: 20%;
}
col.views {
  width: 5%;
}
col.likes {
  width: 5%;
}

th {
  border-bottom: 2px solid black;
}
td {
  padding: 0.5rem 1rem;
  border-bottom: 1px dashed black;
  text-align: center;
}

th,
td {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

td.title {
  text-align: start;
}

- table-layout:fixed → 내가 입력한 만큼 layout 고정시키기 위해 작성

- col. 으로 각각의 class이름으로 스타일 줄 수 있음

- 넘치는 내용을 다음줄로 넘기지 않고 줄어든 내용을 ... 으로 표현하기

   

 

 

2. js로 tbody 내용 만들고 thead th의 값 넣어주기 (localStorage 활용)

const temps = [
  {
    num: 0,
    title: "제목1",
    user: "김보람",
    text: "지금은 안보이는 내용",
    createdAt: Date.now(),
    views: 0,
    likes: 0,
    comments: [],
  },
  {
    num: 0,
    title: "제목2",
    user: "김보람",
    text: "지금은 안보이는 내용",
    createdAt: Date.now(),
    views: 0,
    likes: 0,
    comments: [],
  },
  {
    num: 3,
    title: "제목6",
    user: "김보람",
    text: "지금은 안보이는 내용",
    createdAt: Date.now(),
    views: 0,
    likes: 0,
    comments: [],
  },
];

const splitStr = "/,/,/,";

const list = {
  numbers: localStorage.getItem("numbers")?.split(splitStr) || [],
  titles: localStorage.getItem("titles")?.split(splitStr) || [],
  users: localStorage.getItem("users")?.split(splitStr) || [],
  createdAts: localStorage.getItem("createdAts")?.split(splitStr) || [],
  views: localStorage.getItem("views")?.split(splitStr) || [],
  likes: localStorage.getItem("likes")?.split(splitStr) || [],
};
console.log(list);
const listElem = document.getElementById("list");

const thList = ["numbers", "titles", "users", "createdAts", "views", "likes"];

for (let i = 0; i < list.numbers.length; ++i) {
  const tr = document.createElement("tr");
  thList.forEach((item) => {
    const td = document.createElement("td");
    if (item == "titles") td.classList.add("title");
    if (item == "createdAts")
      td.innerHTML = new Date(+list[item][i]).toLocaleString();
    else td.innerHTML = list[item][i];
    tr.append(td);
  });
  listElem.append(tr);
}

- tbody (id=list) 에 게시글 내용이 들어가게 tr과  td생성해주기

- localStorage.getItem() 에 저장해두기

  → string으로 받기 때문에 key, value를 잘라주기위해 split 적어주기

      → , 대신해서 /,/,/, 을 splitStr 으로 지정

- 다시 입력해보면서 공부하기

 

 

3. html에서 create 페이지 만들기, css

<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Creat Board</title>
    <link rel="stylesheet" href="public/index.css" />
  </head>
  <body>
    <div id="root">
      <div>
        <a href="../"><button>Home</button></a>
      </div>
      <div>
        <div><input type="text" id="title" placeholder="Title" /></div>
        <div><input type="text" id="user" placeholder="User" /></div>
        <!-- <div><input type="text" id="text" placeholder="Text" /> -->
        <div>
          <textarea name="text" id="text" placeholder="Text"></textarea>
        </div>
        <div><button id="add">등록</button></div>
      </div>
    </div>
    <script src="./public/index.js"></script>
  </body>
</html>

- <a>로 home과 create 를 연결시켜주기

- input으로 사용자에게 title, user, text 입력하게 해주기

- 작성한 내용 home에 게시되도록 등록버튼 만들어주기

input,
textarea {
  width: 100%;
}

textarea {
  min-height: 10rem;
  resize: none;
}

#root div {
  margin: 1rem 0;
}

#title {
  font-size: 2rem;
}

- text를 입력하는칸(textarea)에 최소 높이를 지정해주고, 크기 고정해두기

 

 

 

4. js로 등록 버튼 onclick 이벤트 주기 (localStorage 활용)

const splitStr = "/,/,/,";

const numbers = localStorage.getItem("numbers")?.split(splitStr) || [];
const titles = localStorage.getItem("titles")?.split(splitStr) || [];
const users = localStorage.getItem("users")?.split(splitStr) || [];
const texts = localStorage.getItem("texts")?.split(splitStr) || [];
const createdAts = localStorage.getItem("createdAts")?.split(splitStr) || [];
const views = localStorage.getItem("views")?.split(splitStr) || [];
const likes = localStorage.getItem("likes")?.split(splitStr) || [];
const comments = localStorage.getItem("comments")?.split(splitStr) || [];

document.getElementById("add").onclick = () => {
  if (numbers.length) {
    numbers.push(+numbers[numbers.length - 1] + 1);
  } else {
    numbers.push(1);
  }
  localStorage.setItem("numbers", numbers.join(splitStr));
  //   console.log(localStorage.getItem("numbers").split(splitStr));

  const title = document.getElementById("title").value;
  //   console.log(title);
  titles.push(title);
  localStorage.setItem("titles", titles.join(splitStr));
  //   console.log(localStorage.getItem("titles").split(splitStr));

  const user = document.getElementById("user").value;
  //   console.log(user);
  users.push(user);
  localStorage.setItem("users", users.join(splitStr));
  //   console.log(localStorage.getItem("users").split(splitStr));

  const text = document.getElementById("text").value;
  //   console.log(text);
  texts.push(text);
  localStorage.setItem("texts", texts.join(splitStr));
  //   console.log(localStorage.getItem("texts").split(splitStr));

  createdAts.push(Date.now());
  localStorage.setItem("createdAts", createdAts.join(splitStr));

  views.push(0);
  localStorage.setItem("views", views.join(splitStr));

  likes.push(0);
  localStorage.setItem("likes", likes.join(splitStr));

  comments.push([]);
  localStorage.setItem("comments", comments.join(splitStr));

  alert("등록되었습니다.");

  window.location.href = "../";
};

- 버튼을 눌렀을때 사용자가 입력한 title, user, text가 home table에 등록되게 연결시켜주기

- alert로 등록되었습니다 라는 창이 뜨고 확인을 누르면 home 페이지로 돌아가게하기

 

 

5. 결과

create 눌러서 게시글 작성
작성한 다음 home 화면으로 돌아감
console 창


 오늘의 포인트와 남겨두기 ★

 

넘치는 내용을 다음줄로 넘기지 않고 줄어든 내용을 ... 으로 표현하기

th,
td {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

 

※ CRUD (Create, Read, Update, Delete) - 기본적인 데이터 처리기능

    → 데이터를 생성하고, 데이터를 읽고, 새로운 데이터를 업데이트하고, 데이터를 삭제하는 것

 

※ 수업시간에 했던 기존 코드도 다시보고 공부하기 

더보기
const temps = [
  {
    num: 0,
    title: "제목1",
    user: "김보람",
    text: "지금은 안보이는 내용",
    createdAt: Date.now(),
    views: 0,
    likes: 0,
    comments: [],
  },
  {
    num: 0,
    title: "제목2",
    user: "김보람",
    text: "지금은 안보이는 내용",
    createdAt: Date.now(),
    views: 0,
    likes: 0,
    comments: [],
  },
  {
    num: 3,
    title: "제목6",
    user: "김보람",
    text: "지금은 안보이는 내용",
    createdAt: Date.now(),
    views: 0,
    likes: 0,
    comments: [],
  },
];

localStorage.setItem("list", temps);
console.log(localStorage.getItem("list"));

localStorage.clear();
localStorage.setItem("numbers", [1, 2].join(splitStr));
localStorage.setItem("titles", ["확인중", "확인중"].join(splitStr));
localStorage.setItem("users", ["김보람", "확인중"].join(splitStr));
localStorage.setItem("texts", ["내용 확인중"].join(splitStr));
localStorage.setItem("createdAts", [Date.now(), Date.now()].join(splitStr));
localStorage.setItem("views", [0, 0].join(splitStr));
localStorage.setItem("likes", [0, 0].join(splitStr));
localStorage.setItem("comments", [[], []].join(splitStr));
console.log(localStorage.getItem("list"));

const numbers = localStorage.getItem("numbers");
const titles = localStorage.getItem("titles");
const users = localStorage.getItem("users");
// const texts = localStorage.getItem("texts");
const createdAts = localStorage.getItem("createdAts");
const views = localStorage.getItem("views");
const likes = localStorage.getItem("likes");
// const comments = localStorage.getItem("comments");

console.log(localStorage.getItem("numbers"));

const thList = ["num", "title", "user", "createdAt", "views", "likes"];


// 1번 방법이 있고
for (let j = 0; j < temps.length; ++j) {
  const tr = document.createElement("tr");
  for (let i = 0; i < thList.length; ++i) {
    const td = document.createElement("td");
    tr.append(td);
    td.innerHTML = temps[j][thList[i]];
  }
  listElem.append(tr);
}

// 2번 방법이 있음
temps.forEach((item) => {
  const tr = document.createElement("tr");
  thList.forEach((th) => {
    const td = document.createElement("td");
    tr.append(td);
    td.innerHTML = item[th];
  });
  listElem.append(tr);
});

 

 

 

*** 앞으로 백엔드, 서버를 배우고 블록체인까지 배워 개발자가 되는 그날까지 화이팅!!!!!!!!!!

** 목표에 대해 생각하자!!!!!

* 만들고 싶은것의 흐름을 생각해보기