vue-Router路由

单页应用

是无刷新,整个webapp就一个html文件,里面的各个功能页面是javascript通过hash,或者history api来进行路由,并通过ajax拉取数据来实现响应功能。因为整个webapp就一个html,所以叫单页面!

 vue-router原理

vue-router通过hash与history两种方式实现前端路由的,'更新视图但不重新请求页面'是前端路由原理的核心之一。

在vue-router中提供mode参数来决定采用哪种方式,默认是hash

(1)mode:'hash':  http://localhost:8080/#/recommend      多了“#”

(2)mode:'history':http://localhost:8080/recommend

hash与history的区别:

hash模式url里面永远带着#号,在开发过程中默认使用这个模式。如果用户考虑到url的规范就需要使用history模式了。

hash的特点在于,hash虽然出现在url中,但不会被包括在HTTP请求中,对后端完全没有影响,因此改变hash不会重新加载页面。

hash模式(用户体验好)

原理:利用hashchange事件监听URL中(锚点)hash路由的变化。

window.addEventListener('hashchange',function(e){

  console.log(e);

})

而history不怕前进和后退,就怕刷新,当刷新时,如果服务器没有相应的资源时,会报404错误。

history利用了html5新增的pushState()和replaceState()方法,应用于浏览器的历史记录栈。在当前以有的back、forward、go的基础上,他们提供了对历史纪录进行修改的功能.

两种模式比较:

一般的需求场景中,hash模式与histiry模式是差不多的,但是调用history.pushState()相比于直接修改hash主要有以下优势:

(1)pushState设置的新url可以是与当前url同源的任意url,而hash只可修改#后面的部分,故只可设置与当前同文档的url。

(2)pushState设置的新url可以与当前url一模一样,这样也会把记录添加到栈中,而hash设置的新值必须与原来不一样才会触发记录添加到栈中。

(3)pushState通过stateObject可以添加任意类型的数据,而hash只可添加短字符串。

路由:

<div id="app">
  <h1>router</h1>
  <!--通过to属性指定链接-->
  <router-link to='/foo'>Go to Foo</router-link>
  <router-link to='/bar'>Go to Bar</router-link>

  <!--路由匹配的组件在此处渲染-->
  <router-view></router-view>
</div>
<script>
  //定义组件
  const Foo={template:'<div>foo</div>'}
  const Bar={template:'<div>bar</div>'}

  const routes=[
    {path:'/foo',component:Foo},
    {path:'/bar',component:Bar}
  ] 

  //创建 router 实例,然后传 `routes` 配置
  const router=new VueRouter({
    routes
  })


new Vue({
el:"#app",
router
})
</script>

嵌套路由,主要是由我们的页面结构所决定的。当我们进入到home页面的时候,它下面还有分类,如手机系列,平板系列,电脑系列。当我们点击各个分类的时候,它还是需要路由到各个部分,如点击手机,它肯定到对应到手机的部分。

  在路由的设计上,首先进入到 home ,然后才能进入到phone, tablet, computer.  Phone, tablet, compute 就相当于进入到了home的子元素。所以vue  提供了childrens 属性,它也是一组路由,相当于我们所写的routes。

  首先,在home页面上定义三个router-link 标签用于导航,然后再定义一个router-view标签,用于渲染对应的组件。router-link 和router-view 标签要一一对应。home.vue 组件修改如下:

router.js 配置路由,修改如下:

const routes = [

    {
        path:"/home",
     // 下面这个属性也不少,因为,我们是先进入home页面,才能进入子路由 component: home,
     // 子路由
    children: [
      {
          path: "phone",
          component: phone
      },
      {
          path: "tablet",
          component: tablet
      },
  // 当进入到home时,下面的组件显示   {    path: "",   component: phone   }   ]
}
]
原文地址:https://www.cnblogs.com/xiaoan0705/p/8797970.html