프로젝트

노션 (자바스크립트) 클론 코딩 (3) 디자인 수정

알럽유 2024. 11. 16. 01:13
728x90
반응형
export default function SidebarPage({ $target, initalState }) {
    this.state = initalState
    const $page = document.createElement('div')
    $page.innerHTML = 'sidebar'
    $target.appendChild($page)
}

 

저번 시간에 이어서 상태를  this.state = initalState 로 만들어서 사용합니다.

 

이를 통해 컴포넌트 내부에서 상태를 일관되게 관리할 수 있습니다.

 

map함수를 통해 state의 제목과 번호를 을 추출해서 <li>를 통해 화면에 띄우겠습니다.

export default function SidebarPage({ $target, initalState }) {
    this.state = initalState
    const $page = document.createElement('div')
    $page.innerHTML = `
        <ul>
            ${this.state
                .map((row) => `<li>${row.id} / ${row.title}</li>`)
                .join('')}
        </ul>
    `
    $target.appendChild($page)
}

 

다음은 재귀형태로 자식 요소까지 화면에 나오게 css부분을 수정하겠습니다.

 

 

화면에 보이는것 처럼 기본적으로 주는 공백들을 제거하는 방법은 styles폴더에 reset.css 파일을 하나 만들어준 후

/* http://meyerweb.com/eric/tools/css/reset/ 
   v2.0 | 20110126
   License: none (public domain)
*/

html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video {
    margin: 0;
    padding: 0;
    border: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
    display: block;
}
body {
    line-height: 1;
}
ol,
ul {
    list-style: none;
}
blockquote,
q {
    quotes: none;
}
blockquote:before,
blockquote:after,
q:before,
q:after {
    content: '';
    content: none;
}
table {
    border-collapse: collapse;
    border-spacing: 0;
}

 

그 다음 style.css파일에

@import 'reset.css';

 

해줍니다.

빈 공백에 사라지게 됩니다.

 

또한 sidebarpage에서 페이지에 클래스명을 추가해준후 css도 수정하겠습니다.

 

SidebarPage.js

export default function SidebarPage({ $target, initalState }) {
    this.state = initalState

    const $page = document.createElement('div')
    $page.classList.add('listContainer')
    $page.innerHTML = `
        <ul>
            ${this.state
                .map(
                    (document) =>
                        `<li class="dataList">📄 ${document.title}
                        <button class="addBtn">➕</button>
                        <button class="delBtn">🗑️</button>
                    </li>`
                )
                .join('')}
        </ul>
    `
    $target.appendChild($page)
}

 

style.css

@import 'reset.css';

#app {
    display: flex;
    flex-decoration: row;
}

/* sidebar */
ul {
    list-style-type: circle;
}
li {
    margin-top: 4%;
}

.listContainer {
    width: 300px;
    height: 1000px;
    background-color: #f7f6f3;
    overflow: auto;
    resize: horizontal;
}

.dataList {
    margin: 10% 0;
    color: #808080;
}
.addBtn,
.delBtn {
    background-color: #f7f6f3;
    color: black;
    border: none;
}

.addBtn:hover,
.delBtn:hover {
    cursor: pointer;
}

 

하지만 자식요소인 id 2,3 가 안들어와서 재귀 형태로 데이터들을 불러오게 하겠습니다.

export default function SidebarPage({ $target, initalState }) {
    this.state = initalState
    this.createTreeView = (data) => {
        let str = ''
        for (const key in data) {
            if (data[key].documents.length > 0) {
                str += `
                    <li class="dataList">
                        📄 ${data[key].title}
                        <button class="addBtn">➕</button>
                        <button class="delBtn">🗑️</button>
                        <ul>${this.createTreeView(data[key].documents)}</ul>
                    </li>`
            } else {
                str += `
                    <li class="dataList">
                        📄 ${data[key].title}
                        <button class="addBtn">➕</button>
                        <button class="delBtn">🗑️</button>
                    </li>`
            }
        }
        return str
    }

    const $page = document.createElement('div')
    $page.classList.add('listContainer')
    $page.innerHTML = `
        <ul>
            ${this.state
                .map(
                    (document) =>
                        `<li class="dataList">📄 ${document.title}
                        <button class="addBtn">➕</button>
                        <button class="delBtn">🗑️</button>
                    </li>
                    ${
                        document.documents.length > 0
                            ? `<ul> ${this.createTreeView(
                                  document.documents
                              )}</ul>`
                            : ''
                    }
                    `
                )

                .join('')}
        </ul>
    `
    $target.appendChild($page)
}