본문 바로가기

프로그래밍/javascript&typescript

첫번째 프로젝트:hacker news(5) 라우터

이전 코드에서 한 화면에 모든 것이 함께 표시되는 이유는 root라는 id를 가지고 있는 컨테이너에  appendChild를 통해서 기존의 코드를 유지한 채로 새로운 것을 추가 하고 있기 때문이다. 따라서 한 화면에서 하나의 페이지만 보여주기 위해서는 다른 로직이 필요하다.

appendChild로 데이터를 넣어주는 코드를 사용하지 않고, root 안에 존재하던 하위의 코드를 다 없애버리기 위해서  root 자체에 innerHTML을 이용한다. 

 

const container = document.getElementById('root');

// 기존 코드 
container.appendChild('<h1>TITLE</h1>')

// 변경 코드 
container.innerHTML(`<h1>TITLE</h1>`)

 

목록의 경우 for문을 사용하여 구현하고 있는데, 기존의 코드는 DOM Api를 사용해서 만들었기 때문에 따로 문제가 될 여지가 없었다. 

하지만 이를 문자열 형식으로 변경해서 html 구조처럼 보기 쉽게 만드려고 하면 반복문만으로 쉽게 처리가 어렵고 중간단계가 많이 필요하게 된다. 

 

이럴 경우에는 배열을 이용해서 해결이 가능하다. 

 

const newsList = []; 

newsList.push('<ul>');

for(let i = 0; i < 10 ; i++) {
  newsList.push(`
    <li>
      <a href=#${newsFeed[i].id}>
     	 ${newsFeed[i].title}(${newsFeed[i].comments_count})
      </a>
    </li>
  `)
}
newsList.push('</ul>');

container.innerHTML = newsList.join('');

 

먼저 빈 배열을 만들고, push 함수를 사용하여 ul을 배열에 넣은 후에 타이틀을 포함한 li 문자열을 반복문을 통해 배열에 추가하고, 반복문이 끝난 후 마지막으로 닫는 ul 태그를 넣는다. 

그리고 나서 배열을 하나로 합쳐주면 되는데, 이 때 사용하는 함수가  join()이다. 

join은 인자를 따로 넣지 않으면 배열안에 요소들을 합칠 때 구분자로 쉼표를 사용하게 되는데, 우리는 통합된 하나의 문자열을 얻는 것이 목적이기 때문에 따로 구분자를 사용하지 않기 위해 빈 문자열을 인자로 넣어줘야한다. 

 

라우터 

라우터는 화면 전환을 해주는 역할을 한다. 

작성한 코드에서 router의 역할은 hash가 변경될 때 마다 호출되어, 변경된  hash 내용에 따라 다른 화면을 제공하는 것이다. 

 

function router() {
    const routePath = location.hash; 
    
    if(routePath === ''){
        newsFeed(); 
    }else {
        newsDetail(); 
    }
}

window.addEventListener('hashchange', router);

router();

 

'프로그래밍 > javascript&typescript' 카테고리의 다른 글

첫번째 프로젝트:hacker news(6) 페이징  (0) 2021.09.13
javascript 환경  (0) 2021.09.12
첫번째 프로젝트:hacker-news(1-4)  (0) 2021.09.11
node.js & npm  (0) 2021.09.10
Typescript  (0) 2021.09.09