SPA

  • 单页Web应用(single page web application,SPA)。
  • 整个应用只有一个完整的页面。
  • 点击页面中的链接不会刷新页面,只会做页面的局部更新。
  • 数据都需要通过ajax请求获取, 并在前端异步展现。

一般组件和路由组件

  1. 写法不同:
    • 一般组件:<Demo/>
    • 路由组件:<Route path="/demo" component={Demo}/>
  2. 存放位置不同:
    • 一般组件:components
    • 路由组件:pages
  3. 接收到的props不同:
    • 一般组件:写组件标签时传递了什么,就能收到什么
    • 路由组件:接收到三个固定的属性
      history:
      go: ƒ go(n)
      goBack: ƒ goBack()
      goForward: ƒ goForward()
      push: ƒ push(path, state)
      replace: ƒ replace(path, state)
      
      location:
      pathname: "/about"
      search: ""
      state: undefined
      
      match:
      params: {}
      path: "/about"
      url: "/about"
      

NavLink

  • 带有高亮显示的路由。
  • 给选中的路由添加active样式。
  • 可以使用 activeClassName 添加选中后的样式。
  • 如果有相同的classname或者其他内容,可以将其进行封装。

Switch

  • 通常情况下,path和component是一一对应的关系。
  • Switch可以提高路由匹配效率(单一匹配)。

解决多级路径刷新页面样式丢失的问题

  1. public/index.html 中 引入样式时不写 ./ 写 / (常用)
  2. public/index.html 中 引入样式时不写 ./ 写 %PUBLIC_URL% (常用)
  3. 使用HashRouter

路由的严格匹配与模糊匹配

  1. 默认使用的是模糊匹配(简单记:【输入的路径】必须包含要【匹配的路径】,且顺序要一致)
  2. 开启严格匹配:<Route exact={true} path="/about" component={About}/>
  3. 严格匹配不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由

向路由组件传递参数

  1. params参数
  • 路由链接(携带参数):<Link to='/demo/test/tom/18'}>详情</Link>
  • 注册路由(声明接收):<Route path="/demo/test/:name/:age" component={Test}/>
  • 接收参数:this.props.match.params
  1. search参数
  • 路由链接(携带参数):<Link to='/demo/test?name=tom&age=18'}>详情</Link>
  • 注册路由(无需声明,正常注册即可):<Route path="/demo/test" component={Test}/>
  • 接收参数:this.props.location.search
  • 备注:获取到的search是urlencoded编码字符串,需要借助querystring解析
  1. state参数
  • 路由链接(携带参数):<Link to={{pathname:'/demo/test',state:{name:'tom',age:18}}}>详情</Link>
  • 注册路由(无需声明,正常注册即可):<Route path="/demo/test" component={Test}/>
  • 接收参数:this.props.location.state
  • 备注:刷新也可以保留住参数

编程式路由导航

  • 借助this.prosp.history对象上的API对操作路由跳转、前进、后退
    • this.prosp.history.push()
    • this.prosp.history.replace()
    • this.prosp.history.goBack()
    • this.prosp.history.goForward()
    • this.prosp.history.go()

BrowserRouter与HashRouter的区别

  1. 底层原理不一样:
  • BrowserRouter使用的是H5的history API,不兼容IE9及以下版本。
  • HashRouter使用的是URL的哈希值。
  1. path表现形式不一样
  • BrowserRouter的路径中没有#,例如:localhost:3000/demo/test
  • HashRouter的路径包含#,例如:localhost:3000/#/demo/test
  1. 刷新后对路由state参数的影响
    (1) BrowserRouter没有任何影响,因为state保存在history对象中。
    (2) HashRouter刷新后会导致路由state参数的丢失!!!
  2. 备注:HashRouter可以用于解决一些路径错误相关的问题。

Router 6