reactRouter1 - 路由实现原理(hash, history)

实现原理

1. 利用hash和history这两种模式的底层api实现对路经的切换
2. 根据匹配到的路径,渲染对应的组件

hash模式原理

通过监听 hashchange 事件, 在回调里拿到 window.location.hash 的值
hash 模式演示

  <body>
    <a href="#/a">去a</a>
    <a href="#/b">去b</a>
    <div id="box"></div>
  </body>
  <script>
    let dom = document.getElementById('box');
    // 当hash 值变化, 就会执行回调
    window.addEventListener('hashchange', function () {
      let hash = location.hash;
      dom.innerHTML = hash;
    });
  </script>

hash模式原理

利用History_API,进行路由切换, 在mdn上提到了history栈
说明它的存储形势是个栈结构


在这里插入图片描述


使用的Api:

1. history.pushState(stateObject, title, url) 用于路径的跳转(也就是向history栈添加数据)
2. history.replaceState() 用于修改栈中某个记录的数据
3. onpopstate: 每当活动的历史记录项发生变化时, popstate 事件都会被传递给window对象

history 路由效果演示

  <body>
    <button onclick="goA()">a页面</button>
    <button onclick="goB()">b页面</button>
    <button onclick="goC()">c页面</button>
    <div id="box"></div>
  </body>
  <script>
    let dom = document.getElementById('box');
    function goA() {
      // 传入3个参数:路由参数或自定义的数据, title的标题,要跳转的路径
      history.pushState({ page: 'A' }, 'a页面', '/a');
      dom.innerHTML = 'a 页面';
    }
    function goB() {
      history.pushState({ page: 'B' }, 'b页面', '/b');
      dom.innerHTML = 'b 页面';
    }
    function goC() {
      history.pushState({ page: 'C' }, 'c页面', '/c');
      dom.innerHTML = 'c 页面';
    }
    // 当用户点击浏览器的后退按钮时,触发操作
    window.onpopstate = (e) => {
      console.log(e.state);
      if (e.state.page === 'A') {
        history.pushState(null, null, document.URL);
      }
    };
  </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值