λ Έμ ν΄λ‘λ νλ‘μ νΈμ λν΄ νκ³ ν λ΄μ©μ λλ€. μ€νλ μ€λ₯κ° μμΌλ©΄ λκΈλ‘ μλ €μ£ΌμΈμ©!
λ Έμ μ λ°λλΌJSλ§μΌλ‘ ꡬννλ κ³Όμ μμ΅λλ€. λ°λλΌJSλ‘ μ»΄ν¬λνΈ λΆλ¦¬ λ±μ μκ°νλ©΄μ ꡬννμμ΅λλ€.
index.html
src
β£ components
β β£ App.js
β β£ DocumentEditor.js
β β£ DocumentList.js
β β DocumentsPage.js
β£ utils
β β£ api.js
β β£ router.js
β β storage.js
β£ main.js
β style.css
μμκ°μ΄ ꡬμ±νκΈ° μ μ DocumentListλ₯Ό κ°μ§λ νμ΄μ§ νλ DocumentEditorλ₯Ό κ°μ§λ νμ΄μ§ νλλ‘ νμ΄μ§ 2κ°λ‘ μμ μ νλ€κ° ν λ² κ°μμμμ΅λλ€. λΆλͺ ν ν νμ΄μ§μΈλ° κ°μμ λμ¨ λλ‘ λκ°μ νμ΄μ§λ‘ μμ νλ€κ° 보λκΉ λ°μ΄ν°(state)λ₯Ό κ΄λ¦¬νκΈ° λ무 νλ€μμ΅λλ€. κ·Έλμ μ€μ λ‘λ λ Έμ μ΄ ν νμ΄μ§μ μκΈ° λλ¬Έμ νμ΄μ§λ₯Ό νλλ₯Ό ꡬμ±νκ³ κ·Έ νμ΄μ§μμλ§ λ°μ΄ν°λ₯Ό κ΄λ¦¬νμκ³ μκ°νκ³ μ»΄ν¬λνΈλ₯Ό λ€μ ꡬμ±νμμ΅λλ€.
μ£Όμμ λ°λΌ λ¬λΌμ§λ routeκ΄λ¦¬λ§μ λ΄λΉνκ³ μμ΅λλ€.
fetch APIλ₯Ό μ¬μ©ν λ¬Έμ νΈμ§κΈ°, λ¬Έμ 리μ€νΈλ€μ λν λͺ¨λ λ°μ΄ν°λ€μ κ΄λ¦¬ν©λλ€.
μ²μ Root λ¬Έμλ€μ λ λλ§ νκ³ νμ λ¬Έμλ€μ΄ μκ³ μκ³ μ λ°λΌ μ¬κ·μ μΌλ‘ λ¬Έμλ₯Ό 보μ΄λλ‘ νννμμ΅λλ€.
νΈμ§κΈ°μ λ΄μ©μ μμ±νμ κ²½μ°μ μ΄λ²€νΈλ₯Ό νΈμΆνμ¬ μλμΌλ‘ μλ²μ μ μ₯νλλ‘ κ΅¬ννμμ΅λλ€.
λ¬Έμ 리μ€νΈλ₯Ό λΆλ¬μ€λ κ³Όμ μμ νλ‘μ νΈλ₯Ό λ.. κ°μμμμ΅λλ€. μ²μμ ꡬ쑰λ₯Ό μ‘μ§ μκ³ λ¬΄μμ μ½λλ₯Ό μμ±νλ©΄μ ꡬννμ΅λλ€. κ·Έλ¬λλ 리μ€νΈλ₯Ό λΆλ¬μ€λ κ² κΉμ§λ ꡬννμμ΄λ κ·Έ μ΄νμ μμ λ¬Έμλ€ λΆλ¬μ€κΈ°, λ¬Έμ μΆκ°, ν κΈ, μμ λ²νΌμ ꡬννλ κ²μμ λͺ¨λ λ²½μ λΆλͺνμ΅λλ€.
const renderDocuments = (parentDocumet, currentDocument, depth = 0) => {
if(currentDocument.length < 1){
return;
}
}
currentDocument.forEach( => {
//μ¬κΈ°μ μμ λ¬Έμλ€, νμ¬ λ¬Έμλ€μ λν element, class μΆκ°
// μ¬κ·λ‘ νΈμΆ
renderDocuments($document, childDocuments, depth + 1);
})
μμ κ°μ νμμΌλ‘ μμ λ¬Έμλ€κ³Ό κΈ°λ³Έ λ¬Έμλ€μ λν΄ μμ λ¬Έμλ€κ³Ό ν¨κ» μ¬κ·λ‘ νΈμΆνμ΅λλ€. μμ κ°μ λ°©μμ΄ λ¬Έμ κ° μλ κ²μ μλμ§λ§ λ€λ₯Έ κΈ°λ₯λ€μ μ½κ² ꡬννκΈ° μν΄μλ μμ λ¬Έμλ€μ λ°λ‘ λΆλ¦¬ν΄μΌκ² λ€κ³ μκ°νμ΅λλ€.
λ°λΌμ μλμ κ°μ΄ μ½λλ₯Ό λ³κ²½νμμ΅λλ€.
const renderChildDocumentList = (childDocuments, depth) => {
if (!childDocuments && childDocuments.length < 1) {
return;
}
return renderDocumentList(childDocuments, depth + 1);
};
const renderDocumentList = (documents, depth = 0) => `
<ul>
${documents
.map((documents) => {
return `
//μ¬κΈ°μ κΈ°λ³Έ λ¬Έμ 리μ€νΈ ꡬ쑰 λ£κΈ°
${renderChildDocumentList(documents, depth)}`;
})
.join("")}
</ul>`;
μμ κ°μ΄ λ³κ²½νμλλ ν λμ νμΈνκΈ°λ μ’κ³ ν κΈ, μμ , μΆκ°μ λν μ»΄ν¬λνΈ κ°μ λ°μ΄ν° μ λ¬λ νΈν΄μ‘μ΅λλ€. μ΄ κ³Όμ μμ νμ μꡬμ¬νμ λ¨Όμ λΆμνκ³ κ·Έκ²μ ν λλ‘ μ»΄ν¬λνΈλ₯Ό μ€κ³ νμ κ°λ°μ μμν΄μΌνλ€λ κ²μ λ€μ§νκ² λμμ΅λλ€.
μ°μ μ μΌ λμ λμλ λΆλΆμ μ λͺ©μ μμ νμμ λ λ¬Έμ 리μ€νΈμμ λ°λ‘ λ°μλμ§ μκ³ λλ°μ΄μ€λ‘ μΈν΄ 0.5μ΄ μ΄νμ μμ λλ λΆλΆμ΄λ€. λκ΄μ μ λ°μ΄νΈλ₯Ό λ°°μ μμλ λΆκ΅¬νκ³ μ΄λ€μμΌλ‘ stateλ₯Ό λ³κ²½ν΄μΌ ν μ§ κ°μ΄ μ‘νμ§ μμμ΅λλ€. μ²μμλ idκ°μ μ¬κ·λ‘ μ°Ύμμ κ·Έ κ°μ 리μ€νΈμμ λ μ¬κ·λ‘ μ°Ύμ λ°λ‘ 리μ€νΈμ λ°μνλ λ°©λ²μΌλ‘ μ§ννμμ΅λλ€. μ΄λ κ² μ§ννλ €λ€ λ³΄λ λ무 λΉν¨μ¨μ μΈ κ±°μ κ°μμ μΆνμ λ€μ κ³ λ―Όνμ¬ μ μ©ν μμ μ λλ€.
κ·Έλ¦¬κ³ κ°λ°νλ©΄μ λ²κ·Έκ° λ무 λ§μ΄ λ°κ²¬λμ΄μ μ΄λ° μΌμ΄ μκΈΈ μλ μλ€λ κ²μ μΈμ§νμμ΄μΌ νλλ° μλ¬(λ²κ·Έ)κ° λ°μν΄μΌλ§ κ·Έμ μμΌ μλͺ» ꡬννλ€λ κ²μ κΉ¨λ«κ³ λ³κ²½νλ λ°©μμΌλ‘ λ°λ³΅λκ² κ°λ°νμμ΅λλ€. μ무λλ μ½μ§μ νκ³ λ λ€λΌ λμ± μ΄λ° λ°©μμ΄ μλͺ»λμλ€λ κ²μ λ 체κ°νκ² λμμ΅λλ€.
λ§μ§λ§μΌλ‘ stateκ°μ λ³κ²½νμ§ μκ³ κ³μ 리μ€νΈλ₯Ό λΆλ¬μμ λ°μ΄ν°λ₯Ό μ μ©μμΌ°λ μ , κ·Έλ¦¬κ³ μ€μ λ Έμ μ²λΌ λ¬Έμ λ΄μ©μ λμμΈμ λ³κ²½νλλ‘ μμ ꡬννμ§ λͺ»νλ μ μ΄ λ무 μμ¬μ μ΅λλ€. 맀주 μκ°μ μ‘°κΈμ© λ΄μ λ°°ν¬λ νκ³ λ¦¬ν©ν λ§μ νλ©° κ°μ ν΄ λκ° μμ μ λλ€.
λ§μ΄ μμ¬μ λ νλ‘μ νΈμμ΅λλ€. μκ°λ λΆμ‘±νμκ³ μνκ΄λ¦¬, CSS, μ»΄ν¬λνΈ λΆλ¦¬, λ λλ§ λ± μ 체μ μΌλ‘ λ€μ 리ν©ν λ§ν΄μΌκ² λ€κ³ μκ°νμ΅λλ€. λν νκ³ λ₯Ό μ§μ μμ±ν΄λ³΄λ κ°λ° κ³Όμ , ꡬν λ°©μμ κΈ°λ‘ν΄λλ©΄μ μμ μ ν΄μΌ λ΄κ° μ΄λ»κ² κ°λ°νκ³ μμκ³ λ€λ₯Έ λ°©λ²μ μ΄λ€κ² μμλμ§, μ΄λ€ λ¬Έμ κ° μμλμ§ λ±μ λν μκ°μ λ°λ³΅νμ§ μλλ€λ μ λ κΉ¨λ¬μμ΅λλ€. μ΄λ° κ²λ€μ κΈ°λ‘νλ μ°μ΅μ΄ νμνλ€κ³ μκ°ν©λλ€.
λν λλ¦ μΌμ κ΄λ¦¬λ μ νλ©΄μ μ§ννμλ€κ³ μκ°νμ§λ§ μμμΉ λͺ»ν μΌμ μΈμ λ μΌμ΄λ μ μκ³ κ·Έμ λν΄μ μ± μμ μμ μ΄ μ ΈμΌ νλ€λ κ²μ λ€μκΈ μΌκΉ¨μ°κ² λμμ΅λλ€.
νμ§λ§ λ°λλΌJSλ‘ μ²μ ν΄λ³Έ νλ‘μ νΈμμμλ λΆκ΅¬νκ³ νΌμμ μ΄μ λ κ°λ°ν μ μμλ€λ κ²μ λν΄ λλ₯Ό μΉμ°¬ν΄μ£Όκ³ μΆμ΅λλ€. νμ μ±μ₯μ΄ μ²΄κ°λμ§ μμμλλ° λ°λλΌJSλ‘ μ΄μ λκΉμ§ ꡬννλ€λ κ²μ μΆ©λΆν μ±μ₯νκ³ μμλ€λ κ²μ μ΄μ μμΌ κΉ¨λ«κ² λμμ΅λλ€. κ·Έλ¦¬κ³ λ Έμ ν΄λ‘λ νλ‘μ νΈλ₯Ό νλ©΄μ νμλ€κ³Όμ μν΅, κ°λ°νλ€ λ§νμ λ λλ£λ€μ΄ μΌλ§λ λμμ΄ λλμ§ λ±μ λν΄μ ν° κ²½νμ΄ λμμ΅λλ€.
μ λ μκ²½λκ³Ό κ°μ κ³ λ―Όμ νμ΅λλ€!
"μ°μ μ μΌ λμ λμλ λΆλΆμ μ λͺ©μ μμ νμμ λ λ¬Έμ 리μ€νΈμμ λ°λ‘ λ°μλμ§ μκ³ λλ°μ΄μ€λ‘ μΈν΄ 0.5μ΄ μ΄νμ μμ λλ λΆλΆμ΄λ€. λκ΄μ μ
λ°μ΄νΈλ₯Ό λ°°μ μμλ..." λΆλΆμ΄ μ λ§ κ³΅κ°λλλ°μ!
μ λ κ³ λ―Όμ νλ€κ° κ²°κ΅ TITLE_STATE λΌλ κ°μ λ‘컬 μ€ν 리μ§μ μ μ§νλ λ°©μμΌλ‘ ꡬννμμ΅λλ€. νμ§λ§ λ‘컬μ€ν 리μ§λ₯Ό λ¨μ©νλ κ² κ°μ λ€μ νλ‘μ νΈλλ μ μ¬ν μν©μ΄ μκΈ°λ©΄ λ κ³ λ―Όμ ν΄λ³Ό μκ°μ
λλ€ γ
γ
μ’μ κΈ μ μ½κ³ κ°λλ€!! ππ
리μ€νΈ ꡬννμ λ°©μ λ무 λ©μ Έμ! μ λ μ¬κ·λ‘νλ©΄μ μ...μ΄κ±΄ μλλ°...μΆλ€κ°λ λ§μμ΄κΈν΄μ κ·Έλ₯ μΌλ€κ°, λμ€κ°μ μλ λͺ»λκ² λλ²λ Έμ΄μγ γ μμ μ½λ©μ greedyνκ² νλ©΄ μλ©λλ€...
μκ²½λ κ³Όμ νμλλΌ μ λ§ μκ³ λ§μΌμ ¨μ΅λλ€!! μμμΉ λͺ»ν μν© μμμλ μ΄λ κ² κ΅¬ννμ κ² λ무 λ©μ Έμ~ μ΄λ² νλ‘μ νΈλ₯Ό λ°νμΌλ‘ λ μ±μ₯νλ κ°λ°μκ° λμ΄λ³΄μꡬμ~