VanillaJS 라우터 작성 방법

10633 단어 routerjavascript


질문은 다음과 같습니다.
  • 페이지에 경로별 콘텐츠를 표시하여 링크 클릭에 반응합니다.
  • 사용자가 브라우저를 뒤로 또는 앞으로 클릭하면 올바른 경로와 해당 콘텐츠가 로드되어야 합니다.
  • 사용자가 새로고침하면 현재 경로에 대한 콘텐츠가 로드되어야 합니다.


  • 시작하려면 HTML 페이지를 다음과 같이 만드십시오.

    <body>
        <div id="nav"></div>
        <div id="app"></div>
    
        <script src="src/index.js"></script>
    </body>
    


    이제 index.js에서 다음 구성을 추가해 보겠습니다.

    const routes = {
      '/': {
        linkLabel: 'Home',
        content: `I am in home page`
      },
      '/about': {
        linkLabel: 'About',
        content: `I am in about page`
      },
      '/friends': {
        linkLabel: 'Friends',
        content: `I am in friends page`,
      },
    };
    


    이 시점에서 구성 전원 라우터를 만들려고 하는 것이 분명합니다. 즉, 탐색 항목을 만든 다음 클릭 핸들러를 등록해야 합니다.

    그들을 위한 기능을 추가해 봅시다.

    const app = document.querySelector('#app');
    const nav = document.querySelector('#nav');
    
    // function to create new nav items
    const renderNavlinks = () => {
      const navFragment = document.createDocumentFragment();
      Object.keys(routes).forEach(route => {
        const { linkLabel } = routes[route];
    
        const linkElement = document.createElement('a')
        linkElement.href = route;
        linkElement.textContent = linkLabel;
        linkElement.className = 'nav-link';
        navFragment.appendChild(linkElement);
      });
    
      nav.append(navFragment);
    };
    
    // function to register click handlers
    const registerNavLinks = () => {
      nav.addEventListener('click', (e) => {
        e.preventDefault();
        const { href } = e.target;
        history.pushState({}, "", href);
        navigate(e); // pending implementation
      });
    };
    


    이제 navigate 함수를 구현해야 합니다. 실제 탐색을 처리합니다.

    const renderContent = route => app.innerHTML = routes[route].content;
    
    const navigate = e => {
        const route = e.target.pathname;
        // this is responsible for adding the new path name to the history stack
        history.pushState({}, "", route);
        renderContent(route);
    };
    


    이제 남은 일은 팝 상태 이벤트(브라우저 앞뒤로 처리)를 처리하고 초기 페이지 로드를 처리하는 것입니다.

    const registerBrowserBackAndForth = () => {
      window.onpopstate = function (e) {
        const route = location.pathname;
        renderContent(route);
      };
    };
    
    const renderInitialPage = () => {
      const route = location.pathname;
      renderContent(route);
    };
    


    종합:

    (function bootup() {
      renderNavlinks();
      registerNavLinks();
      registerBrowserBackAndForth();
      renderInitialPage();
    })();
    


    최종 데모:
    이것이 우리가 만들려고 하는 것입니다: (codesandbox 데모 확인)


    ...

    여기까지 읽어주셔서 감사합니다.

    좋은 웹페이지 즐겨찾기