路由

作者: 海山城 | 来源:发表于2018-07-04 13:36 被阅读0次

什么是路由

路由用简要来说就是根据路径选择不同的页面展示给用户,这就是路由。
下面以点击tab导航的不同元素,从而展现不同的内容为例,来演示前后端路由的实现过程以及区别。

后端路由(后端实现路由)

  • 前端代码
//html
<x-tab>
  <ul class="tabs">
    <li><a href="./tab1">tab1</a></li>
    <li><a href="./tab2">tab2</a></li>
  </ul>
</x-tab>
  • 服务器端代码
if (pathName === '/tab1'){
    let string = fs.readFileSync('./tab1.html', 'utf8')
    response.setHeader('Content-Type', 'text/html; charset=utf8')
    response.write(string)
    response.end()
} else if (pathName === '/tab2'){
    let string = fs.readFileSync('./tab2.html', 'utf8')
    response.setHeader('Content-Type', 'text/html; charset=utf8')
    response.write(string)
    response.end()
}

总结

  1. 服务器端的if else,根据请求的不同路径,向用户展示不同的内容,就是后端实现的路由
  2. 服务器端实现路由是多页应用,点击请求不同路径,会跳转到不同页面

前端路由(前端实现路由)

方案一:利用hash(锚点)
  • 前端代码
//html
<x-tab>
  <ul class="tabs">
    <li><a href="#0">tab1</a></li>
    <li><a href="#1">tab2</a></li>
  </ul>
  <ul class="contents">
    <li>content1</li>
    <li>content2</li>
  </ul>
</x-tab>
<a href="#top">回到顶部</a>
//css
x-tab{display: block;}
.tabs > li.active {background: red;}
.contents > li {display: none;}
.contents > li.active {display: block;}
//js
selectTab()
window.onhashchange = () => {
  selectTab()
}
function selectTab(){
  let index = location.hash || '#0'
  index = index.substring(1)
  
  if (index === '0') {
    $('x-tab > .tabs > li').eq(0).addClass('active').siblings().removeClass('active')
    $('x-tab > .contents > li').eq(0).addClass('active').siblings().removeClass('active')
  } else if (index === '1') {
    $('x-tab > .tabs > li').eq(1).addClass('active').siblings().removeClass('active')
    $('x-tab > .contents > li').eq(1).addClass('active').siblings().removeClass('active')
  }

  //上面if else可以合起来写成下面的,为了直观的显示路由,故意拆开来写的
  // $('x-tab > .tabs > li').eq(index).addClass('active').siblings().removeClass('active')
  // $('x-tab > .contents > li').eq(index).addClass('active').siblings().removeClass('active')
}

总结

  1. 根据选择不同的a,展现出不同的内容(if... else if...),并且是通过锚点来记录页面状态
  2. 这是单页应用,无页面跳转
    3.这种方案的缺点是有如上回到顶部的a连接,其锚点为#top,会扰乱页面状态
    4.这种方法无需后端配合
方案二:利用path
  • 前端代码
//html(index.html)
<x-tab>
  <ul class="tabs">
    <li><a href="./tab1">tab1</a></li>
    <li><a href="./tab2">tab2</a></li>
  </ul>
  <ul class="contents">
    <li>content1</li>
    <li>content2</li>
  </ul>
</x-tab>
<a href="#top">回到顶部</a>
//css
x-tab{display: block;}
.tabs > li.active {background: red;}
.contents > li {display: none;}
.contents > li.active {display: block;}
//js
selectTab()
$('x-tab').on('click', '.tabs > li > a', (e) => {
  e.preventDefault()
  let $a = $(e.currentTarget)
  let path = $a.attr('href')
  window.history.pushState(null,null,path)
  selectTab()
})

function selectTab(){
  let index = location.pathname.substring(1) || 'tab1'
  index = index.substring(3)
  $('x-tab > .tabs > li').eq(index-1).addClass('active').siblings().removeClass('active')
  $('x-tab > .contents > li').eq(index-1).addClass('active').siblings().removeClass('active')
}
  • 后端代码
if (pathName === '/' || pathName === '/tab1' || pathName === '/tab2'){
    let string = fs.readFileSync('./index.html', 'utf8')
    response.setHeader('Content-Type', 'text/html; charset=utf8')
    response.write(string)
    response.end()
}

总结

  1. window.history.pushState向url中加入一个路径,并且不刷新页面
  2. 这种方案在页面点击的时候没有问题,当刷新的时候,因为路径中多了/tab1或/tab2,所以需要后端支持这个两个路径,并且返回也是当前页面,这也是一个单页应用
  3. 这里的回到顶部的a链接(#top)并不能影响到路径,因此,不会影响到页面状态

相关文章

  • thinkphp5学习笔记(三)路由配置

    URL请求的执行流程 路由模式 路由注册 路由规则 路由地址 路由参数 变量规则 路由分组 别名路由 路由绑定

  • larevel 路由索引

    基本路由:路由重定向、视图路由路由参数:必选、可选、正则表达式命名路由路由组:中间件、命名空间、子域名路由、路由前...

  • laravel路由

    2 路由格式 3 路由参数 4 .路由别名 5 .路由群组

  • Vue3: 前端路由的概念和原理

    1、什么是路由 路由(英文:router)就是对应关系。路由分为两大类:① 后端路由② 前端路由 2、后端路由 后...

  • 组件化2.路由框架的设计

    路由框架原理 路由框架是为了实现组件之间的通信 路由框架维护了一个分组的路由表路由表中存放了路由地址和路由信息路由...

  • vue中的路由

    vue中4中路由包含: 1、动态路由2、嵌套路由3、编程式路由4、命名式路由 1、动态路由 2、嵌套路由 3、编程...

  • React-Router知识点

    路由的分类 页面路由 hash 路由 h5路由 react路由 react-router-dom 路由方式 h5路...

  • 路由策略

    路由策略和策略路由 什么是路由策略?路由策略和策略路由有什么区别? 如何配置路由策略? https://blog....

  • Laravel 学习笔记

    路由 文件位置: app/Http/routes.php 基础路由get/post 多请求路由 路由参数 路由别名...

  • React路由

    React路由 一、路由的形式 hash路由 : HashRouter history路由 : BrowserRo...

网友评论

      本文标题:路由

      本文链接:https://www.haomeiwen.com/subject/pwgjuftx.html