# 路由原理

# 基于 Hash

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <div id="app">
      <a href="#/home">首页</a>
      <a href="#/about">关于</a>

      <div class="router-view"></div>
    </div>

    <script>
      // 获取 router-view 的DOM
      const routerViewEL = document.querySelector(".router-view");

      // 监听URL的改变
      window.addEventListener("hashchange", () => {
        console.log(location.hash);
        switch (location.hash) {
          case "#/home":
            routerViewEL.innerHTML = "首页";
            break;
          case "#/about":
            routerViewEL.innerHTML = "关于";
            break;
          default:
            routerViewEL.innerHTML = "";
            break;
        }
      });
    </script>
  </body>
</html>

# 基于 History

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <div id="app">
      <a href="/home">首页</a>
      <a href="/about">关于</a>

      <div class="router-view"></div>
    </div>

    <script>
      // 获取 router-view 的DOM
      const routerViewEL = document.querySelector(".router-view");

      // 获取所有的a元素,自己监听a元素的改变
      const aEls = document.getElementsByTagName("a");
      for (const item of aEls) {
        item.addEventListener("click", (e) => {
          e.preventDefault();
          const href = item.getAttribute("href");
          history.pushState({}, "", href);
          urlChange();
        });
      }

      // 执行返回/前进操作时,依然调用urlChange
      window.addEventListener("popstate", urlChange);

      // 监听URL的改变
      function urlChange() {
        console.log("urlChange", location.pathname);
        switch (location.pathname) {
          case "/home":
            routerViewEL.innerHTML = "首页";
            break;
          case "/about":
            routerViewEL.innerHTML = "关于";
            break;
          default:
            routerViewEL.innerHTML = "";
            break;
        }
      }
    </script>
  </body>
</html>
最后更新: 2022/9/12 16:01:28