路由匹配

uni-app 中原有 pages.json 配置,这是为 uni-app 编译为不同端而制定的配置文件。同样路由也包涵其中,有时候我们需要更多的自定义参数作为页面中的引用。routes 选项就是为这个而准备的。看个简单的例子:

基本路由配置

  1. const router = new Router({
  2. routes:[
  3. {
  4. //这时的path的必须和pages.json中的配置相同
  5. path: '/pages/tabbar/tabbar-1/tabbar-1',
  6. extra:{
  7. pageStyle:{
  8. color:'#f00'
  9. //...... 更多自定义参数
  10. }
  11. }
  12. },
  13. {
  14. //这时的path的必须和pages.json中的配置相同
  15. path: '/pages/tabbar/tabbar-2/tabbar-2',
  16. extra:{
  17. pageStyle:{
  18. color:'#fff'
  19. //......
  20. }
  21. }
  22. }
  23. ]
  24. });

你可以在对应的组件内查看相关路由元信息

  1. //tabbar-1.vue
  2. <template>
  3. <view>
  4. <h1>tabbar-1</h1>
  5. </view>
  6. </template>
  7. <script>
  8. export default {
  9. onLoad() {
  10. console.log(this.$Route); //这时你可以看到你在routes中所匹配的路由项
  11. }
  12. }
  13. </script>

这是一个简单而又实用的列子。对于 v1.3.5 起的 H5还有更多的配置,甚至你可以通过配置 uni-simple-router 实例化参数来控制 H5运行模式

H5端完全使用vue-router开发 v1.3.5+

下面是一个完全使用 vue-router路由匹配 - 图1 开发的模式的例子:

  1. const router = new Router({
  2. h5:{
  3. vueRouterDev:true, //完全使用vue-router开发 默认 false
  4. },
  5. routes:[
  6. {
  7. path:'/',
  8. name:'router1',
  9. component:()=>import('@/common/router/router1.vue'),
  10. children:[
  11. {
  12. path:'route1/children1',
  13. name:'children1',
  14. component:()=>import('@/common/router/router1/children1.vue'),
  15. },
  16. {
  17. path:'route1/:id',
  18. name:'children2',
  19. component:()=>import('@/common/router/router1/children2.vue'),
  20. }
  21. ]
  22. },
  23. ]
  24. });

当设置 vueRouterDev:true 后,你可以在任何地方进行挂载或者嵌套。它能使用 vue-router 的所有功能,api等等。同时它也将会失去 uni-app 的生命周期。更多请查看 vue-router路由匹配 - 图2 官方文档。此时你的组件页面也应该是使用 vue-router 的api及组件,废弃掉 uni-simple-router 的api。

  1. //router1.vue
  2. <template>
  3. <div>
  4. //通过vue-router全局组件router-view来挂载视图
  5. <router-view></router-view>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. data() {
  11. return {}
  12. },
  13. created(){
  14. console.log(this.$route) //此时我们使用vue-router的api进行获取
  15. },
  16. }
  17. </script>

你还可以点击这里进行学习更多配置。有时候你在H5端做简单的路由url美化,你还可以这样做:

H5端自定义url v1.3.5+

除了可以 完全使用vue-router开发 以外,你还可以在 uni-app 原有配置的基础上进行修改 url。

  1. const router = new Router({
  2. h5:{
  3. useUniConfig:true, //采用在pages.json下的所有页面配置信息,默认为true
  4. },
  5. routes:[
  6. {
  7. name:'router1',
  8. //为了兼容其他端,此时的path不能少,必须和 pages.json中的页面路径匹配
  9. path: "/pages/tabbar/tabbar-1/tabbar-1",
  10. aliasPath: '/tabbar-1',
  11. },
  12. ]
  13. });

上面的配置很简单,你只需要配置一个简单的 aliasPath 即可。 通过设置 aliasPath 别名来重置 uni-app 的默认路径,如果你不提供 aliasPathuni-simple-router 则默认采用 path 作为路径进行匹配。所有这时的 path 是不能缺少的。作为基础,及为了兼容其他端,此时的path不能少,必须和 pages.json中的页面路径匹配。 因为 uni-app 在h5端时,第一个页面都设置为 '/' ,你可以不用配置。

H5端动态加载页面 v1.3.5+

其实和上面的几种配置大同小异。动态加载组件,其实就是不采用 uni-app中pages.json 里面的配置页面。通过设置路由的 component 选项进行动态加载。

  1. const router = new Router({
  2. h5:{
  3. useUniConfig:false,
  4. },
  5. routes:[
  6. {
  7. name:'router1',
  8. //为了兼容其他端,此时的path不能少,必须和 pages.json中的页面路径匹配
  9. path: "/pages/tabbar/tabbar-1/tabbar-1",
  10. component: () => import('@/pages/component/tabbar-1.vue'),
  11. aliasPath: '/tabbar-1',
  12. },
  13. ]
  14. });

一个简单的 component 选项进行动态加载。设置 useUniConfig:false完全使用vue-router开发 基本一致。他们简单的区别就在于 useUniConfig:false 不能设置子路由,只能是一层路由、不能 高级匹配模式路由匹配 - 图3

H5端捕获所有路由或404路由 v1.3.5

常规参数只会匹配被 / 分隔的 URL 片段中的字符。如果想匹配 任意路径 ,我们可以使用通配符 (*):

  1. {
  2. // 会匹配所有路径
  3. path: '*'
  4. }
  5. {
  6. // 会匹配以 `/user-` 开头的任意路径
  7. path: '/user-*'
  8. }

当使用通配符路由时,请确保路由的顺序是正确的,也就是说含有通配符的路由应该放在最后。路由 { path: '*' } 通常用于客户端 404 错误。如果你使用了History 模式,请确保正确配置你的服务器路由匹配 - 图4

匹配优先级 v1.3.5+

有时候,同一个路径可以匹配多个路由,此时,匹配的优先级就按照路由的定义顺序:谁先定义的,谁的优先级就最高。(目前更多的是变现在H5端)