vue5-路由

  • vue2.0中的$router 和 $route的区别
    • 参考:https://www.cnblogs.com/czy960731/p/9288830.html
    • 1.router是VueRouter的一个对象,通过Vue.use(VueRouter)和VueRouter构造函数得到一个router的实例对象,这个对象中是一个全局的对象,他包含了所有的路由包含了许多关键的对象和属性。
      举例:history对象
      $router.push({path:‘home’});本质是向history栈中添加一个路由,在我们看来是 切换路由,但本质是在添加一个history记录
      方法:
      $router.replace({path:‘home’});//替换路由,没有历史记录
    • 2.route是一个跳转的路由对象,每一个路由都会有一个route对象,是一个局部的对象,可以获取对应的name,path,params,query等
      我们可以从vue devtools中看到每个路由对象的不同
      在这里插入图片描述

路由

1.安装

1.全局安装,导入script 的url

在这里插入图片描述
2.webpack安装 模块化
模块化:例如基于webpack构建
在这里插入图片描述

Vue.use (VueRouter) 相当于把后者注册到Vue身上

2.使用

第一步导入包
在这里插入图片描述
一导入路径就会变成hash路由

第二部:
在这里插入图片描述

在这里插入图片描述第三步:
在这里插入图片描述

第四步:
在这里插入图片描述

3.跳转

方式一:
在这里插入图片描述

方式二:router-link
在这里插入图片描述
方式三:
$.route.push()

4.redirect重定向

在这里插入图片描述

5.高亮

在这里插入图片描述
根据上面,可直接重新定义下面的样式:
在这里插入图片描述

方法二:
在这里插入图片描述
在这里插入图片描述

6.动画

在这里插入图片描述

在这里插入图片描述

watch: {
  '$route' (to, from) {
    const toDepth = to.path.split('/').length
    const fromDepth = from.path.split('/').length
    this.transitionName = toDepth < fromDepth ? 'slide-right' : 'slide-left'
  }
}

7.传参 query param

query

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

param

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8.路由嵌套

在这里插入图片描述
不要加斜杠!!

不用children,在外面定义的话,count组件会被那个组件给覆盖;
用children的话,就不会被覆盖
在这里插入图片描述

9. 路由 导航守卫

在这里插入图片描述
组件内的守卫
最后,你可以在路由组件内直接定义以下路由导航守卫:

beforeRouteEnter
beforeRouteUpdate (2.2 新增)
beforeRouteLeave
const Foo = {
  template: `...`,
  beforeRouteEnter (to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
  },
  beforeRouteUpdate (to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }
}

10. 举例:路由实现景点布局

放三个组件
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.设样式
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

hash 和 history模式

参考:https://www.cnblogs.com/JRliu/p/9025290.html
用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下):

1.记录当前页面的状态(保存或分享当前页的url,再次打开该url时,网页还是保存(分享)时的状态);
2.可以使用浏览器的前进后退功能(如点击后退按钮,可以使页面回到使用ajax更新页面之前的状态,url也回到之前的状态);
作为开发者,要实现这两个功能,我们需要做到:

1.改变url且不让浏览器向服务器发出请求;
2.监测 url 的变化;
3.截获 url 地址,并解析出需要的信息来匹配路由规则。
我们路由常用的hash模式和history模式实际上就是实现了上面的功能。

1.hash模式

这里的 hash 就是指 url 尾巴后的 # 号以及后面的字符。这里的 # 和 css 里的 # 是一个意思。hash 也 称作 锚点,本身是用来做页面定位的,她可以使对应 id 的元素显示在可视区域内。

由于 hash 值变化不会导致浏览器向服务器发出请求,而且 hash 改变会触发 hashchange 事件,浏览器的进后退也能对其进行控制,所以人们在 html5 的 history 出现前,基本都是使用 hash 来实现前端路由的。

使用到的api:

window.location.hash = 'qq' // 设置 url 的 hash,会在当前url后加上 '#qq'

var hash = window.location.hash // '#qq'  

window.addEventListener('hashchange', function(){ 
    // 监听hash变化,点击浏览器的前进后退会触发
})

vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。

2.history模式

如果不想要很丑的 hash,我们可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。
已经有 hash 模式了,而且 hash 能兼容到IE8, history 只能兼容到 IE10,为什么还要搞个 history 呢?
首先,hash 本来是拿来做页面定位的,如果拿来做路由的话,原来的锚点功能就不能用了。其次,hash 的传参是基于 url 的,如果要传递复杂的数据,会有体积的限制,而 history 模式不仅可以在url里放参数,还可以将数据存放在一个特定的对象中。
history 模式改变 url 的方式会导致浏览器向服务器发送请求,这不是我们想看到的,我们需要在服务器端做处理:如果匹配不到任何静态资源,则应该始终返回同一个 html 页面。

const router = new VueRouter({
  mode: 'history',
  routes: [...]
})

当你使用 history 模式时,URL 就像正常的 url,例如 http://yoursite.com/user/id,也好看!
不过这种模式要玩好,还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问 http://oursite.com/user/id 就会返回 404,这就不好看了。

所以呢,你要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。

滚动行为

使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。 vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动。

注意: 这个功能只在支持 history.pushState 的浏览器中可用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值