美文网首页
vur-router知识点总结

vur-router知识点总结

作者: 有你有团 | 来源:发表于2020-03-21 13:55 被阅读0次

编程式导航

router.push

注意:在 Vue 实例内部,你可以通过 router 访问路由实例。因此你可以调用 this.router.push。
想要导航到不同的 URL,则使用 router.push 方法。这个方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的 URL。
当你点击 <router-link> 时,这个方法会在内部调用,所以说,点击 <router-link :to="..."> 等同于调用 router.push(...)。

// 字符串
router.push('home')
// 对象
router.push({ path: 'home' })
// 命名的路由
router.push({ name: 'user', params: { userId: '123' }})
// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})

router.replace

跟 router.push 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。

router.go(n)

这个方法的参数是一个整数,意思是在 history 记录中向前或者后退多少步,类似 window.history.go(n)。

命名视图

有时候想同时 (同级) 展示多个视图,而不是嵌套展示,例如创建一个布局,有 sidebar (侧导航) 和 main (主内容) 两个视图,这个时候命名视图就派上用场了。你可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。如果 router-view 没有设置名字,那么默认为 default

<router-view class="view one"></router-view>
<router-view class="view two" name="a"></router-view>
<router-view class="view three" name="b"></router-view>

一个视图使用一个组件渲染,因此对于同个路由,多个视图就需要多个组件。确保正确使用 components 配置 (带上 s):

const router = new VueRouter({
  routes: [
    {
      path: '/',
      components: {
        default: Foo,
        a: Bar,
        b: Baz
      }
    }
  ]
})

声明式导航router-link

<router-link> 组件支持用户在具有路由功能的应用中 (点击) 导航。 通过 to 属性指定目标地址,默认渲染成带有正确链接的 <a> 标签,可以通过配置 tag 属性生成别的标签.。另外,当目标路由成功激活时,链接元素自动设置一个表示激活的 CSS 类名。
<router-link> 比起写死的 <a href="..."> 会好一些,理由如下:
无论是 HTML5 history 模式还是 hash 模式,它的表现行为一致,所以,当你要切换路由模式,或者在 IE9 降级使用 hash 模式,无须作任何变动。
在 HTML5 history 模式下,router-link 会守卫点击事件,让浏览器不再重新加载页面。
当你在 HTML5 history 模式下使用 base 选项之后,所有的 to 属性都不需要写 (基路径) 了。

to

  • 类型:string | location
  • required
    表示目标路由的连接,当被点击后,内部会立刻把值传到router.push()所以这个值可以是一个字符串或者是描述目标位置的对象
<router-link to='home'>home</router-link> //字符串
//渲染结果
<a href='home'>home</a>
//使用v-bind js表达式,也可以写简写 “:”
<router-link v-bind:to='home'>home</router-link> 
<router-link :to='{path:"home"}'>home</router-link>
//命名路由,routes中要有name,params 是参数
<router-link :to='{name:'user',params:{userId:132}}'>home</router-link>
//带查询参数,结果为/user?userId=132
<router-link :to='{path:'user',query:{userId:132}}'>home</router-link>

vue-router的params和query传参(接受参数),route, router区别

//query
传参: 
this.$router.push({
        path:'/xxx'
        query:{
          id:id
        }
      })
  
接收参数:
this.$route.query.id

//params
传参: 
this.$router.push({
        name:'xxx'
        params:{
          id:id
        }
      })
  
接收参数:
this.$route.params.id

注意:params传参,push里面只能是 name:"XXX",不可以是 path:"/XXX" ,因为params只能用来引入路由,如果这里写成了path,接受参数页面会是underfined!!!

另外,二者还有一点区别,query相当于get请求,页面跳转可以在地址栏看到请求参数,而params相当于post请求,参数不会在地址栏中显示

*注意:传参是,this.$route ,接受参数是 this.$route *

this. $route为当前router跳转对象,可以获取name,path,query,paramsdeng
this. $router为vuerouter实例

replace

  • 类型:boolean
  • 默认值:false
    设置 replace 属性的话,当点击时,会调用 router.replace() 而不是 router.push(),于是导航后不会留下 history 记录。
<router-link v-bind:to='home' replace>home</router-link> 

append

  • 类型:boolean
  • 默认值:false
    设置 append 属性后,则在当前 (相对) 路径前添加基路径。例如,我们从 /a 导航到一个相对路径 b,如果没有配置 append,则路径为 /b,如果配了,则为 /a/b。
<router-link v-bind:to='home' append>home</router-link> 

tag

  • 类型:string
  • 默认值:'a'
    有时候想要 <router-link> 渲染成某种标签,例如 <li>。 于是我们使用 tag prop 类指定何种标签,同样它还是会监听点击,触发导航。
<router-link v-bind:to='home' tag="li">home</router-link> 

active-class

  • 类型:string
  • 默认值:'router-link-active'
    设置链接激活时使用的 CSS 类名。默认值可以通过路由的构造选项 linkActiveClass 来全局配置。
 new VueRouter ({
  mode:'hash', //默认hash模式,可以改为history模式
  base:'./',  //如果是history模式就可以不用写基础路径了
  routes:constantRoutes ,
  linkActiveClass:'is-active'
})

重定向

重定向也是通过 routes 配置来完成,下面例子是从 /a 重定向到 /b:

const router = new VueRouter({
  routes: [
    { path: '/a', redirect: '/b' }
  ]
})
//重定向的目标也可以是一个命名的路由:
const router = new VueRouter({
  routes: [
    { path: '/a', redirect: { name: 'foo' }}
  ]
})

别名

“重定向”的意思是,当用户访问 /a时,URL 将会被替换成 /b,然后匹配路由为 /b,那么“别名”又是什么呢?
/a 的别名是 /b,意味着,当用户访问 /b 时,URL 会保持为 /b,但是路由匹配则为 /a,就像用户访问 /a 一样。
上面对应的路由配置为:

const router = new VueRouter({
  routes: [
    { path: '/a', redirect: '/b' }
  ]
})
//重定向的目标也可以是一个命名的路由:
const router = new VueRouter({s
  routes: [
    { path: '/a', component: A, alias: '/b' }
  ]
})

导航守卫

全局前置守卫

正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。
记住参数或查询的改变并不会触发进入/离开的导航守卫。你可以通过观察 $route 对象来应对这些变化,或使用 beforeRouteUpdate 的组件内守卫

你可以使用 router.beforeEach 注册一个全局前置守卫:

const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
  // ...
})
to: route:即将要进入得目标
form:当前导航正要离开的路由‘
next:function()一定要调用该方法来resolve这个钩子,执行效果依赖next()方法调用参数
  *   **`next()`**: 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 **confirmed** (确认的)。

*   **`next(false)`**: 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 `from` 路由对应的地址。

*   **`next('/')` 或者 `next({ path: '/' })`**: 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 `next` 传递任意位置对象,且允许设置诸如 `replace: true`、`name: 'home'` 之类的选项以及任何用在 [`router-link` 的 `to` prop](https://router.vuejs.org/zh/api/#to) 或 [`router.push`](https://router.vuejs.org/zh/api/#router-push) 中的选项。

*   **`next(error)`**: (2.4.0+) 如果传入 `next` 的参数是一个 `Error` 实例,则导航会被终止且该错误会被传递给 [`router.onError()`](https://router.vuejs.org/zh/api/#router-onerror) 注册过的回调。

确保要调用 next 方法,否则钩子就不会被 resolved

登录验证

//main.js
router.beforeEach((to,from,next) => {
  if(to.meta.requireAuth){
    next()
  }else{
    next({
      path:'/login',
      query:{
        redirect:to.fullPath   
      } //将跳转得路由path作为参数,登录成功后跳转到该路由
    })
  }else{
    next()
  }
})

相关文章

网友评论

      本文标题:vur-router知识点总结

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