http://521daxue.wikidot.com/hmwangduh https://vk.com/id690753581 https://vk.com/public209578729 https://vk.com/public209578716 https://vk.com/public209578706 https://vk.com/public209578700 https://vk.com/public209578693 https://vk.com/public209578677 https://vk.com/public209578671 https://vk.com/public209578660 https://vk.com/public209578655 https://vk.com/public209578647 https://vk.com/public209578639 https://vk.com/public209578620 https://vk.com/public209511857 https://vk.com/public209511580 https://vk.com/public209511287 https://vk.com/public209511116 https://vk.com/public209510911 https://vk.com/public209510773 https://vk.com/public209510425 https://vk.com/public209510300 https://vk.com/public209510020 https://vk.com/public209509912 https://vk.com/public209509711 https://vk.com/public209509707 https://vk.com/public209509699 https://vk.com/public209468344 https://vk.com/public209468335 https://vk.com/public209468320 https://vk.com/public209468312 https://vk.com/public209468304 https://vk.com/public209468299 https://vk.com/public209468293 https://vk.com/public209468283 https://vk.com/public209468271 https://vk.com/public209468261 https://vk.com/public209468250 https://vk.com/public209468240 https://vk.com/public209468230 https://vk.com/public209428688 https://vk.com/public209428684 https://vk.com/public209428672 https://vk.com/public209428669 https://vk.com/public209428665 https://vk.com/public209428661 https://vk.com/public209428659 https://vk.com/public209428656 https://vk.com/public209428653 https://vk.com/public209428651 https://vk.com/public209428646 https://vk.com/public209428641 https://vk.com/public209428633 https://vk.com/public209371893 https://vk.com/public209371887 https://vk.com/public209371877 https://vk.com/public209371858 https://vk.com/public209371852 https://vk.com/public209371841 https://vk.com/public209371834 https://vk.com/public209371813 https://vk.com/public209371826 https://vk.com/public209371802 https://vk.com/public209371790 https://vk.com/public209371780 https://vk.com/public209298957 https://vk.com/public209298947 https://vk.com/public209298934 https://vk.com/public209298926 https://vk.com/public209298917 https://vk.com/public209298875 https://vk.com/public209298871 https://vk.com/public209298862 https://vk.com/public209298719 https://vk.com/public209298858 https://vk.com/public209298843 https://vk.com/public209250048 https://vk.com/public209250049 https://vk.com/public209298805 https://vk.com/public209298789 https://vk.com/public209250046 https://vk.com/public209249995 https://vk.com/public209249993 https://vk.com/public209249990 https://vk.com/public209211432 https://vk.com/public209249983 https://vk.com/public209249955 https://vk.com/public209249951 https://vk.com/public209249946 https://vk.com/public209249859 https://vk.com/public209249942 https://vk.com/public209249892 https://vk.com/id691331608 https://vk.com/public209578989 https://vk.com/public209578950 https://vk.com/public209578938 https://vk.com/public209578933 https://vk.com/public209578925 https://vk.com/public209578914 https://vk.com/public209578899 https://vk.com/public209578888 https://vk.com/public209578880 https://vk.com/public209578893 https://vk.com/public209578873 https://vk.com/public209578867 https://vk.com/public209578862 https://vk.com/public209512875 https://vk.com/public209512865 https://vk.com/public209512856 https://vk.com/public209512847 https://vk.com/public209512843 https://vk.com/public209512838 https://vk.com/public209512826 https://vk.com/public209512816 https://vk.com/public209512811 https://vk.com/public209512801 https://vk.com/public209512791 https://vk.com/public209512748 https://vk.com/public209512718 https://vk.com/public209468471 https://vk.com/public209468465 https://vk.com/public209468449 https://vk.com/public209468440 https://vk.com/public209468455 https://vk.com/public209468436 https://vk.com/public209468430 https://vk.com/public209468423 https://vk.com/public209468420 https://vk.com/public209468418 https://vk.com/public209468400 https://vk.com/public209468391 https://vk.com/public209468380 https://vk.com/public209428748 https://vk.com/public209428746 https://vk.com/public209428735 https://vk.com/public209428738 https://vk.com/public209428732 https://vk.com/public209428729 https://vk.com/public209428726 https://vk.com/public209428723 https://vk.com/public209428721 https://vk.com/public209428705 https://vk.com/public209428700 https://vk.com/public209428710 https://vk.com/public209372099 https://vk.com/public209372093 https://vk.com/public209372086 https://vk.com/public209372073 https://vk.com/public209372066 https://vk.com/public209372059 https://vk.com/public209372050 https://vk.com/public209372042 https://vk.com/public209372033 https://vk.com/public209372028 https://vk.com/public209372018 https://vk.com/public209372011 https://vk.com/public209300371 https://vk.com/public209300362 https://vk.com/public209300352 https://vk.com/public209300343 https://vk.com/public209300333 https://vk.com/public209300325 https://vk.com/public209300315 https://vk.com/public209300304 https://vk.com/public209300300 https://vk.com/public209300297 https://vk.com/public209300275 https://vk.com/public209300271 https://vk.com/public209300252 https://vk.com/id691333652 https://vk.com/public209579274 https://vk.com/public209579265 https://vk.com/public209579260 https://vk.com/public209579251 https://vk.com/public209579240 https://vk.com/public209579232 https://vk.com/public209579224 https://vk.com/public209579217 https://vk.com/public209579208 https://vk.com/public209579199 https://vk.com/public209579187 https://vk.com/public209579176 https://vk.com/public209579168 https://vk.com/public209513027 https://vk.com/public209513018 https://vk.com/public209513011 https://vk.com/public209513004 https://vk.com/public209512995 https://vk.com/public209512986 https://vk.com/public209512977 https://vk.com/public209512971 https://vk.com/public209512966 https://vk.com/public209512957 https://vk.com/public209512953 https://vk.com/public209512946 https://vk.com/public209512938 https://vk.com/public209468590 https://vk.com/public209468563 https://vk.com/public209468557 https://vk.com/public209468551 https://vk.com/public209468544 https://vk.com/public209468537 https://vk.com/public209468527 https://vk.com/public209468523 https://vk.com/public209468515 https://vk.com/public209468505 https://vk.com/public209468499 https://vk.com/public209468493 https://vk.com/public209428794 https://vk.com/public209428790 https://vk.com/public209428788 https://vk.com/public209428785 https://vk.com/public209428780 https://vk.com/public209428777 https://vk.com/public209428774 https://vk.com/public209428771 https://vk.com/public209428768 https://vk.com/public209428766 https://vk.com/public209428761 https://vk.com/public209428759 https://vk.com/public209428755 https://vk.com/public209372256 https://vk.com/public209372248 https://vk.com/public209372245 https://vk.com/public209372227 https://vk.com/public209372216 https://vk.com/public209372238 https://vk.com/public209372200 https://vk.com/public209372196 https://vk.com/public209372175 https://vk.com/public209372184 https://vk.com/public209372161 https://vk.com/public209372138 https://vk.com/public209300713 https://vk.com/public209300701 https://vk.com/public209372149 https://vk.com/public209300682 https://vk.com/public209300675 https://vk.com/public209300660 https://vk.com/public209300654 https://vk.com/public209300616 https://vk.com/public209300624 https://vk.com/public209300610 https://vk.com/public209300604 https://vk.com/public209300592 https://vk.com/public209300584 https://vk.com/public209300527 https://vk.com/id691338584 https://vk.com/public209579598 https://vk.com/public209579588 https://vk.com/public209579579 https://vk.com/public209579574 https://vk.com/public209579568 https://vk.com/public209579560 https://vk.com/public209579549 https://vk.com/public209579535 https://vk.com/public209579527 https://vk.com/public209579522 https://vk.com/public209579514 https://vk.com/public209579508 https://vk.com/public209579500 https://vk.com/public209513195 https://vk.com/public209513186 https://vk.com/public209513173 https://vk.com/public209513165 https://vk.com/public209513151 https://vk.com/public209513142 https://vk.com/public209513118 https://vk.com/public209513114 https://vk.com/public209513109 https://vk.com/public209513099 https://vk.com/public209513083 https://vk.com/public209513078 https://vk.com/public209513063 https://vk.com/public209468710 https://vk.com/public209468704 https://vk.com/public209468692 https://vk.com/public209468685 https://vk.com/public209468681 https://vk.com/public209468673 https://vk.com/public209468664 https://vk.com/public209468659 https://vk.com/public209468649 https://vk.com/public209468644 https://vk.com/public209468636 https://vk.com/public209468629 https://vk.com/public209468622 https://vk.com/public209428854 https://vk.com/public209428850 https://vk.com/public209428846 https://vk.com/public209428840 https://vk.com/public209428836 https://vk.com/public209428832 https://vk.com/public209428828 https://vk.com/public209428825 https://vk.com/public209428823 https://vk.com/public209428818 https://vk.com/public209428809 https://vk.com/public209428808 https://vk.com/public209428804 https://vk.com/public209372563 https://vk.com/public209372541 https://vk.com/public209372512 https://vk.com/public209372485 https://vk.com/public209372457 https://vk.com/public209372402 https://vk.com/public209372429 https://vk.com/public209372379 https://vk.com/public209372370 https://vk.com/public209372352 https://vk.com/public209372345 https://vk.com/public209372364 https://vk.com/public209372337 https://vk.com/public209302220 https://vk.com/public209302215 https://vk.com/public209302204 https://vk.com/public209302191 https://vk.com/public209302182 https://vk.com/public209302173 https://vk.com/public209302166 https://vk.com/public209302150 https://vk.com/public209302146 https://vk.com/public209302138 https://vk.com/public209302131 https://vk.com/public209302036 https://vk.com/public209301900 https://vk.com/public209301786 https://vk.com/id691343832 https://vk.com/public209579817 https://vk.com/public209579811 https://vk.com/public209579800 https://vk.com/public209579793 https://vk.com/public209579774 https://vk.com/public209579784 https://vk.com/public209579758 https://vk.com/public209579762 https://vk.com/public209579752 https://vk.com/public209579741 https://vk.com/public209579732 https://vk.com/public209579725 https://vk.com/public209513346 https://vk.com/public209513337 https://vk.com/public209579724 https://vk.com/public209513322 https://vk.com/public209513316 https://vk.com/public209513305 https://vk.com/public209513297 https://vk.com/public209513281 https://vk.com/public209513270 https://vk.com/public209513264 https://vk.com/public209513258 https://vk.com/public209513244 https://vk.com/public209513238 https://vk.com/public209513227 https://vk.com/public209468855 https://vk.com/public209468797 https://vk.com/public209468790 https://vk.com/public209468806 https://vk.com/public209468775 https://vk.com/public209468784 https://vk.com/public209468763 https://vk.com/public209468753 https://vk.com/public209468746 https://vk.com/public209468741 https://vk.com/public209468734 https://vk.com/public209468732 https://vk.com/public209468726 https://vk.com/public209428902 https://vk.com/public209428898 https://vk.com/public209428896 https://vk.com/public209428891 https://vk.com/public209428887 https://vk.com/public209428892 https://vk.com/public209428879 https://vk.com/public209428881 https://vk.com/public209428876 https://vk.com/public209428863 https://vk.com/public209428861 https://vk.com/public209428858 https://vk.com/public209428856 https://vk.com/public209372843 https://vk.com/public209372837 https://vk.com/public209372833 https://vk.com/public209372826 https://vk.com/public209372822 https://vk.com/public209372811 https://vk.com/public209372767 https://vk.com/public209372715 https://vk.com/public209372777 https://vk.com/public209372739 https://vk.com/public209372696 https://vk.com/public209372679 https://vk.com/public209302709 https://vk.com/public209302701 https://vk.com/public209302695 https://vk.com/public209302683 https://vk.com/public209302648 https://vk.com/public209302675 https://vk.com/public209302662 https://vk.com/public209302640 https://vk.com/public209302634 https://vk.com/public209302628 https://vk.com/public209302606 https://vk.com/public209302599 https://vk.com/public209302591 https://vk.com/id691579795 https://vk.com/public209580125 https://vk.com/public209580120 https://vk.com/public209580107 https://vk.com/public209580094 https://vk.com/public209580091 https://vk.com/public209580079 https://vk.com/public209580074 https://vk.com/public209580068 https://vk.com/public209580055 https://vk.com/public209580045 https://vk.com/public209580059 https://vk.com/public209580034 https://vk.com/public209580027 https://vk.com/public209513550 https://vk.com/public209513547 https://vk.com/public209513535 https://vk.com/public209513526 https://vk.com/public209513522 https://vk.com/public209513514 https://vk.com/public209513504 https://vk.com/public209513495 https://vk.com/public209513486 https://vk.com/public209513476 https://vk.com/public209513440 https://vk.com/public209513413 https://vk.com/public209468973 https://vk.com/public209513403 https://vk.com/public209468965 https://vk.com/public209468943 https://vk.com/public209468937 https://vk.com/public209468922 https://vk.com/public209468915 https://vk.com/public209468909 https://vk.com/public209468905 https://vk.com/public209468900 https://vk.com/public209468895 https://vk.com/public209468885 https://vk.com/public209468879 https://vk.com/public209468874 https://vk.com/public209428950 https://vk.com/public209428945 https://vk.com/public209428939 https://vk.com/public209428936 https://vk.com/public209428934 https://vk.com/public209428942 https://vk.com/public209428913 https://vk.com/public209428926 https://vk.com/public209428922 https://vk.com/public209428920 https://vk.com/public209428917 https://vk.com/public209428909 https://vk.com/public209428908 https://vk.com/public209373045 https://vk.com/public209373037 https://vk.com/public209373029 https://vk.com/public209373015 https://vk.com/public209373004 https://vk.com/public209372991 https://vk.com/public209372979 https://vk.com/public209372955 https://vk.com/public209372947 https://vk.com/public209372929 https://vk.com/public209372901 https://vk.com/public209372880 https://vk.com/public209372893

分享Vue Router 10 条高级技巧

前言

Vue Router 是 Vue.js 官方的路由管理器。

它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。

包含的功能有:

  • 嵌套的路由/视图表
  • 模块化的、基于组件的路由配置
  • 路由参数、查询、通配符
  • 基于 Vue.js 过渡系统的视图过渡效果
  • 细粒度的导航控制
  • 带有自动激活的 CSS class 的链接
  • HTML5 历史模式或 hash 模式,在 IE9 中自动降级
  • 自定义的滚动条行为

本文是作者是实际项目中遇到的一些总结,主要包括:

  1. 响应路由参数变化
  2. 路由匹配
  3. 高级匹配模式
  4. 匹配优先级
  5. push和replace的第二个第三个参数
  6. 路由视图
  7. 重定向
  8. 使用props解耦$route
  9. 导航守卫
  10. 守卫的next方法

希望本文对你有所帮助。

正文

1. 响应路由参数变化

针对复用组件(只是路由参数发生改变),生命周期函数钩子不会被调用,如何能刷新组件了?

  • watch监听

    watch: {
      '$route' (to, from) {
      // 对路由变化作出响应...
      }
    }
  • beforeRouteUpdate

    beforeRouteUpdate (to, from, next) {
    // react to route changes...
    / / don't forget to call next()
    }

    2. 路由匹配

    {
    // 会匹配所有路径
    path: '*'
    }
    {
    // 会匹配以 `/user-` 开头的任意路径
    path: '/user-*'
    }

    注意:当使用通配符路由时,请确保路由的顺序是正确的,也就是说含有通配符的路由应该放在最后。路由 { path: '*' } 通常用于客户端 404 错误。

如果你使用了History 模式,请确保正确配置你的服务器。

当使用一个通配符时,$route.params 内会自动添加一个名为 pathMatch 参数。

它包含了 URL 通过通配符被匹配的部分:

// 给出一个路由 { path: '/user-*' }
this.$router.push('/user-admin')
this.$route.params.pathMatch // 'admin'
// 给出一个路由 { path: '*' }
this.$router.push('/non-existing')
this.$route.params.pathMatch // '/non-existing'

3. 高级匹配模式

// 命名参数必须有"单个字符"[A-Za-z09]组成
 
// ?可选参数
{ path: '/optional-params/:foo?' }
// 路由跳转是可以设置或者不设置foo参数,可选
<router-link to="/optional-params">/optional-params</router-link>
<router-link to="/optional-params/foo">/optional-params/foo</router-link>
 
// 零个或多个参数
{ path: '/optional-params/*' }
<router-link to="/number">没有参数</router-link>
<router-link to="/number/foo000">一个参数</router-link>
<router-link to="/number/foo111/fff222">多个参数</router-link>
 
 
// 一个或多个参数
{ path: '/optional-params/:foo+' }
<router-link to="/number/foo">一个参数</router-link>
<router-link to="/number/foo/foo111/fff222">多个参数</router-link>
 
// 自定义匹配参数
// 可以为所有参数提供一个自定义的regexp,它将覆盖默认值([^\/]+)
{ path: '/optional-params/:id(\\d+)' }
{ path: '/optional-params/(foo/)?bar' }

4. 匹配优先级

有时候一个路径可能匹配多个路由。

此时,匹配的优先级就是按照路由的定义顺序:先定义,优先级最高。

5. push和replace的第二个第三个参数

在 2.2.0+版本,可选的在 router.push 或 router.replace 中提供 onComplete 和 onAbort 回调作为第二个和第三个参数。

这些回调将会在导航成功完成 (在所有的异步钩子被解析之后) 或终止 (导航到相同的路由、或在当前导航完成之前导航到另一个不同的路由) 的时候进行相应的调用。在 3.1.0+,可以省略第二个和第三个参数,此时如果支持 Promise,router.push 或 router.replace 将返回一个 Promise。

接下来看几个例子来看看第二个第三个参数的调用时机:

1. 组件1跳转组件2

// 组件1
this.$router.push({ name: 'number' }, () => {
  console.log('组件1:onComplete回调');
}, () => {
  console.log('组件1:onAbort回调');
});
// 组件2
beforeRouteEnter(to, from, next) {
  console.log('组件2:beforeRouteEnter');
  next();
},
beforeCreate() {
  console.log('组件2:beforeCreate');
},
created() {
  console.log('组件2:created');
}

组件之间跳转触发onComplete回调。

2. 组件2跳转组件2(不带参数)

this.$router.push({ name: 'number'}, () => {
  console.log('组件2:onComplete回调');
}, () => {
  console.log('组件2,自我跳转:onAbort回调');
});

组件自我跳转当不带参数时触发onAbort回调。但是当自我跳转带参数时可能情况就有点不一样。

3. 组件2跳转组件2(带参数)

this.$router.push({ name: 'number', params: { foo: this.number}}, () => {
    console.log('组件2:onComplete回调');
}, () => {
    console.log('组件2,自我跳转:onAbort回调');
});

组件自我带参数跳转,onComplete回调、onAbort回调回调都不会触发。

6. 路由视图

有时候想同时 (同级) 展示多个视图,而不是嵌套展示,例如创建一个布局,有 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
    }
    }
  ]
});

7. 重定向

{ path: '/a', redirect: '/b' }
{ path: '/a', redirect: { name: 'foo' }}
{ path: '/a', redirect: to => {
  // 方法接收 目标路由 作为参数
  // return 重定向的 字符串路径/路径对象
}}

注意:导航守卫并没有应用在跳转路由上,而仅仅应用在其目标上。

在上面这个例子中,为 /a 路由添加一个 beforeEach 或 beforeLeave 守卫并不会有任何效果。

8. 使用props解耦$route

在组件中使用 $route 会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的 URL 上使用,限制了其灵活性。

// router文件
// 对于包含命名视图的路由,你必须分别为每个命名视图添加 `props` 选项:
{
  path: '/number/:name',
  props: true,
  // 对象模式 props: { newsletterPopup: false }
  // 函数模式 props: (route) => ({ query: route.parmas.name })
  name: 'number',
  component: () => import( /* webpackChunkName: "number" */ './views/Number.vue')
}
// 组件获取
export default{
  props: ['name']
}

9. 导航守卫

1. 三种全局守卫

  • router.beforeEach 全局前置守卫 进入路由之前。
  • router.beforeResolve 全局解析守卫2.5.0新增。在beforeRouteEnter调用之后调用。
  • router.afterEach 全局后置钩子 进入路由之后。

    // 入口文件
    import router from './router'
     
    // 全局前置守卫
    router.beforeEach((to, from, next) => {
    console.log('beforeEach 全局前置守卫');
    next();
    });
    // 全局解析守卫
    router.beforeResolve((to, from, next) => {
    console.log('beforeResolve 全局解析守卫');
    next();
    });
    // 全局后置守卫
    router.afterEach((to, from) => {
    console.log('afterEach 全局后置守卫');
    });

    2. 路由独享守卫

  • beforeEnter全局前置守卫进入路由之前。

    {
      path: '/number/:name',
      props: true,
      name: 'number',
      // 路由独享守卫
      beforeEnter: (to, from, next) => {
          console.log('beforeEnter 路由独享守卫');
          next();
      },
      component: () => import( /* webpackChunkName: "number" */ './views/Number.vue')
    }

    3. 组件内守卫

  • beforeRouteEnter
  • beforeRouteUpdate(2.2新增)
  • beforeRouteLeave

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

10. 守卫的 next 方法

next: 调用该方法 resolve 钩子。

    • next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
    • next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
    • next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: true、name: 'home' 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项。
    • next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。
posted @ 2021-05-06 16:10  前所未有  阅读(121)  评论(0)    收藏  举报
http://energyfuture.wikidot.com/