Skip to content

路由组件

在 uni-simple-router 中,路由组件是指被映射到路由表中的组件,它们会被渲染到对应的路由路径中。uni-simple-router 提供了专属 __dynamicImportComponent__ 辅助函数来导入组件,它使得你在定义和配置路由组件时,变得简单且清晰。

__dynamicImportComponent__ 函数

该函数会在编译时运行,根据你指定的参数将对应组件编译成适合当前平台的导入方式。它的作用是方便你在项目的任意位置导入组件,并确保它们能够在特定平台上正确运行。

我们来看个例子:

编译前源码

js
import {  __dynamicImportComponent__ } from '@/uni-simple-router'  const IndexCom = __dynamicImportComponent__(`@/pages/index.vue`)

编译后源码

H5端的表现

js
import {  __dynamicImportComponent__ } from '@/uni-simple-router'  const component_P8dJH67nkT = ()=>import("@/pages/index.vue"); const IndexCom = component_P8dJH67nkT

非H5端表现

js
import component_hiM9fGDTMz from '@/pages/index.vue' import {  __dynamicImportComponent__ } from '@/uni-simple-router'  const IndexCom = component_P8dJH67nkT

该函数在编译时还会执行其他操作,并生成其他相关的配置数据。为了简洁起见,我只展示了你可能关注的代码部分。总的来说,该函数的目的是将组件编译成适用于特定平台的导入方式。它会根据不同的平台要求进行适配和处理,确保组件在各个平台上能够正常导入和使用。除了导入方式的处理,该函数还可能包括其他编译相关的任务,以确保组件在特定平台下的最佳性能和兼容性。

先决条件

  • 二次赋值后的 __dynamicImportComponent__ 函数导入组件无效
  • __dynamicImportComponent 函数传递的参数必须是静态字符串,目前不支持动态字符串或者变量
  • 只有使用 __dynamicImportComponent__ 函数导入的组件才能在路由表中注册并起效。这个函数会在编译时进行处理,确保组件按需加载和正确导入。如果你直接使用普通的组件导入方式,组件将无法被正确注册到路由表中,导致无法实现期望的效果。因此,请确保在路由表中使用 __dynamicImportComponent__ 函数来导入组件,以确保路由功能的正常运作。

❌ 错误的

js
import {  __dynamicImportComponent__ } from '@/uni-simple-router'  // 不要二次赋值后使用 const __myHelper__ = __dynamicImportComponent__  const IndexCom = __myHelper__(`@/pages/index.vue`)

✅ 正确的

js
import {  __dynamicImportComponent__ } from '@/uni-simple-router'  const IndexCom = __dynamicImportComponent__(`@/pages/index.vue`,{  pageType:`top` })   const router = createRouter({  routes:[{  path:`/`,  component:IndexCom,  }] })
js
import {  __dynamicImportComponent__ } from '@/uni-simple-router'  const router = createRouter({  routes:[{  path:`/`,  component:__dynamicImportComponent__(`@/pages/index.vue`,{  pageType:`top`  }),  }] })

将导入的组件分包

为了减少主包的大小,编译器支持将根组件(顶级页面)注册到分包中。你只需在编译函数中传递以下配置即可:

陷阱提示

  • 分包仅支持根组件(顶级页面),即路径以 / 开头且具有 pageType:'top' 属性的组件。
  • 你无需在 pages.json 文件中配置 subPackages,因为 uni-simple-router 已经完全接管了路由管理,你只需要在 __dynamicImportComponent__ 函数中配置即可。
js
import {  __dynamicImportComponent__ } from '@/uni-simple-router'  const router = createRouter({  routes:[{  path:`/`,  component:__dynamicImportComponent__(`@/pagesA/tabbar/index.vue`,{  pageType:`top`,   package: {   type: `child`,   name: `pagesA/tabbar`   },   }),  },{  path:`/pagesB`,  component:__dynamicImportComponent__(`@/pagesB/tabbar/index.vue`,{  pageType:`top`,   package: {   type: `child`,   },   }),  }] })

上述配置相当于在 pages.json 文件中配置 subPackages 字段一样:

json
{  "subPackages": [  {  "root": "pagesA/tabbar",  "pages": [{  "path": "index",  }]  },   {  "root": "pagesB",  "pages": [{  "path": "tabbar/index",  }]  }  ], }

__dynamicImportComponent__ 函数中,你可以通过 package 字段传递 typename 参数。如果未指定 type,默认会将组件编译到主包中。当设置了 type: 'child' 时,组件会被编译到子包中。在编译为子包时,name 字段将起到作用。如果未设置 name,系统将使用组件引入时的一级目录作为子包的 root 值。

独立的 component

在注册路由时,你可以选择单独传递一个 component 参数。如果只传递了 component ,插件将会将该组件作为 default 的挂载点。如果你传递了 components 参数,并且该组件是顶级页面,你必须为它创建一个 default 的挂载点。对于子路由对应的组件,没有强制要求传递 default 参数。因此,在非必要的情况下,我们强烈建议你使用 component 参数来注册组件,而不是 components 。这样可以简化路由配置,并提高代码的可读性和维护性。

像这样:

✅ 正确的

js
// router.js const router = createRouter({  routes:[{  path:`/`,  component:__dynamicImportComponent__(`@/pages/index.vue`,{  pageType:`top`,  }),  }] })

✅ 正确的

js
// router.js const router = createRouter({  routes:[{  path:`/`,  components:{  default:__dynamicImportComponent__(`@/pages/index.vue`,{  pageType:`top`,  })  },  }] })

❌ 错误的

js
// router.js const router = createRouter({  routes:[{  path:`/`,   components:{   aaa:__dynamicImportComponent__(`@/pages/index.vue`,{   pageType:`top`,   })   },   }] })

多视图 components

components 参数通常用于子路由中。有时候,我们希望同时(同级)展示多个视图,而不是嵌套展示,这时候 components 就发挥了重要作用。你需要配合 <simple-router-view/> 来实现这个功能。使用 components 参数可以灵活地配置多个组件,并在相应的位置同时展示它们。通过与 <simple-router-view/> 配合使用,你可以轻松实现复杂的页面布局和视图组合。如果你希望了解更多,请点击这里

js
// router.js const router = createRouter({  routes:[{  path:`/view`,  component:__dynamicImportComponent__(`@/pages/view.vue`,{  pageType:`top`  }),  children:[{  path:`ls`,  components:{  default:__dynamicImportComponent__(`@/components/view/home.vue`),  LeftSidebar:__dynamicImportComponent__(`@/components/view/LeftSidebar.vue`),  RightSidebar:__dynamicImportComponent__(`@/components/view/RightSidebar.vue`)  }  }]  }] })
vue
// pages/view.vue <template>  <view class="content">  <simple-router-view class="view left-sidebar" name="LeftSidebar"/>  <simple-router-view class="view main-content"/>  <simple-router-view class="view right-sidebar" name="RightSidebar"/>  </view> </template>  <script setup lang="ts">  </script>
路由组件 has loaded