Route Rules 与 Layout
weapp-vite 当前已经支持页面级 layout。它不是单独某一个开关,而是由以下几部分协同工作:
srcRoot/layouts/**:声明可用的 layout 组件或原生 layout 目录definePageMeta({ layout }):在页面里显式指定 layoutweapp.routeRules:在配置层为一批页面声明默认 layoutsetPageLayout()/usePageLayout():在运行时切换或读取当前页面 layout 状态
weapp.routeRules
- 类型:ts
Record<string, { appLayout?: string | false | { name: string props?: Record<string, unknown> } }> - 默认值:
undefined
示例:
ts
import { defineConfig } from 'weapp-vite/config'
export default defineConfig({
weapp: {
routeRules: {
'pages/dashboard/**': {
appLayout: 'dashboard',
},
'pages/admin/**': {
appLayout: {
name: 'admin',
props: {
sidebar: true,
title: 'Admin',
},
},
},
},
},
})作用:
- 为一批页面提供默认 layout
- 当页面本身没有写
definePageMeta({ layout })时,作为回退规则生效 - 适合后台壳子、仪表盘壳子、营销页壳子这类“按目录批量套 layout”的场景
优先级
优先级从高到低:
- 页面源码里的
definePageMeta({ layout }) weapp.routeRulessrcRoot/layouts/default.*作为默认 layout
如果页面显式写了:
ts
definePageMeta({
layout: false,
})则会跳过默认 layout 包裹。
layout 文件放哪里
默认约定在 srcRoot/layouts/ 下:
text
src/
layouts/
default.vue
admin.vue
dashboard.vue
native-shell/
index.json
index.wxml
index.wxss
index.ts支持两种 layout 形式:
*.vue:Vue layout 组件- 原生四件套目录或文件:原生小程序 layout
layout 名称会根据相对 layouts/ 目录的路径推导,例如:
layouts/default.vue→defaultlayouts/admin.vue→adminlayouts/native-shell/index.*→native-shell
页面里怎么声明
1. 直接指定 layout 名
vue
<script setup lang="ts">
definePageMeta({
layout: 'admin',
})
</script>2. 指定 layout + props
vue
<script setup lang="ts">
definePageMeta({
layout: {
name: 'dashboard',
props: {
sidebar: true,
title: '控制台',
},
},
})
</script>3. 显式关闭 layout
vue
<script setup lang="ts">
definePageMeta({
layout: false,
})
</script>NOTE
definePageMeta().layout 只支持静态字符串、false,或 { name, props } 对象。 props 必须是对象字面量,键名必须是静态的。
运行时动态切换
如果页面需要在运行过程中切换 layout,可以使用 wevu 提供的 API:
ts
import { setPageLayout, usePageLayout } from 'wevu'
const currentLayout = usePageLayout()
function switchToAdmin() {
setPageLayout('admin', {
sidebar: true,
title: '管理后台',
})
}
function switchToPlain() {
setPageLayout(false)
}当项目里存在 layout 扫描结果时,.weapp-vite/wevu-layouts.d.ts 会自动为这些 API 生成更严格的类型提示。
layout 相关类型文件
layout 能力会联动生成:
.weapp-vite/wevu-layouts.d.ts.weapp-vite/components.d.ts
其中 wevu-layouts.d.ts 会增强 WevuPageLayoutMap,让 setPageLayout() 与 usePageLayout() 拿到 layout 名称和 props 类型。
适用场景
- 按页面目录批量挂载同一套页面壳子
- 让业务页面复用导航栏、侧边栏、底部容器等布局结构
- 在 Vue layout 与原生 layout 间混合使用
- 在页面运行时按状态切换 layout