列表和详细信息
有关所有权、平台边界和 rc.2/rc.3 区别,请参阅 native 功能和容器选择。
RouterSplitView 当有足够的空间时并排显示列表及其详细信息。在一个狭窄的窗口中,详细信息涵盖了列表。它在两种布局中使用相同的路线和导航方法:
<RouterSplitView name="inbox" list="/messages">
<template #empty>
<Label text="Select a message" horizontalAlignment="center" verticalAlignment="middle" />
</template>
</RouterSplitView>list 路线是固定的首页。推入此 导航栈 的每条非模态路由都会成为一个详细信息,无论其路径或嵌套在路由表中如何。 modal 的航线仍单独开通。命名的分割视图可以与普通的 RouterView 一起存在,包括在不同的选项卡中。
// Inside either pane, useRouter() is bound to the whole split stack.
await router.push('/messages/42')
await router.push('/messages/42/edit')
// From elsewhere, name the stack.
await router.push('/messages/42', { frame: 'inbox' })布局和状态
布局遵循组件的可用宽度(以与设备无关的像素为单位),而不是设备类型或全屏尺寸。因此,改变可用宽度的旋转、窗口大小调整和折叠可以改变布局。默认断点为 840,列表列宽为 320:
<RouterSplitView list="/messages" :breakpoint="900" :listWidth="300" />两个原生框架均保持安装状态。调整大小不会重新创建页面、运行导航 导航守卫 或更改所选路线。列表滚动位置、本地组件状态、未保存的详细信息字段和详细信息的原生背面 导航栈 保持不变。在展开布局中,onPageActivated 的列表和顶部详细信息均处于活动状态;模式会停用两者。 router.currentRoute 仍然是最重要的详细信息,直到用户返回到列表。
当扩展布局没有选定的详细信息时,empty 插槽会出现在详细信息列中。它不是路线或历史条目。
Android 可折叠布局

Android 模拟器:原生窗格将操作系统报告的铰链区域留空。
在 App_Resources/Android/app.gradle 中安装可选的 AndroidX Java 回调桥:
dependencies {
implementation 'androidx.window:window-java:1.5.1'
}添加依赖项后重建原生应用程序。对于 RTL,在 Android 清单的 <application> 上启用 android:supportsRtl="true",就像其他原生 Android 布局一样。 foldAware 默认为 true;当桥可用时,每个安装的分割视图都会从其自己的活动中观察 WindowLayoutInfo。它在卸载或卸载时删除侦听器,并在加载时再次订阅。没有进程范围的前台 Activity 或设备模型启发式选择其所有者。
分离折叠或完全闭锁铰链优先于breakpoint和listWidth。垂直功能将列表和详细信息放置在两个物理区域中;该列表位于 RTL 的右侧。水平功能将列表置于详细信息之上。该间隙不包括铰链,NativeScript 的整数网格长度向外倒圆。仅与一个可用侧相交的视图使用紧凑导航将两个框架保留在该侧。
平坦、不分离、不遮挡的折叠不会改变布局。如果没有相关功能,没有可选的依赖项,并且在 iOS 上,则应用通常的基于宽度的布局。要明确选择退出:
<RouterSplitView list="/messages" :foldAware="false" />相同的框架和页面在姿势变化后仍然存在;导航历史记录、草稿和滚动状态保留附加到其原始条目。 empty 插槽占据详细区域。这是用于单个相交折叠功能的两窗格布局,而不是 Android 活动嵌入或附加原生窗口。包含应用程序仍然拥有其 Android 配置更改和进程恢复策略。
原生证据和复制命令位于可折叠验证中。另请参见 AndroidX WindowManager 和 FoldingFeature 语义。
历史和背部
历史在两种布局中的运作方式相同。使用 push() 选择另一个项目会添加详细信息;它不会放弃之前的选择。鉴于:
/messages → /messages/42 → /messages/42/editBack 首先返回到 /messages/42,然后返回到列表。在展开的布局中,最后一个背面会清除详细信息列。 Native back和router back保持同步,保留导航守卫可以防止页面被删除。
push(list)和backToRoot()通过导航守卫返回现有列表。replace()替换顶部细节。在列表中,它打开第一个详细信息。clearHistory: true清除详细历史记录并保留列表。setStack()将列表保留为第一个条目,在省略时将其添加到前面。pushForResult()像往常一样从详细信息或模态返回结果。restore将组合列表/详细历史记录保存并恢复为名为 导航栈 的历史记录。backToRootOnReselect在TabViewItem内部工作,就像在RouterView上一样。
原生行为
列表和详细信息均使用原生 Frame。详细信息中的透明原生根 Frame 提供其返回目的地;此实现细节永远不会出现在 router.stack 或保存状态中。紧凑模式将细节 Frame 放在列表上;扩展模式将其放在旁边。在调整大小期间,页面永远不会在框架之间传输。
第一个详细信息跨窗格打开,因此此处不使用列表中的共享元素和 iOS 缩放过渡。详细信息页面之间的转换正常工作,包括 Android 预测后预览。从第一个细节返回列表使用 Frame 的正常返回转换。
name 和 list 在组件安装时读取。要创建不同的分体 导航栈,请安装具有不同 Vue key 的新组件。
选择加入 UIKit 列
使用RouterUIKitSplitView作为原生窗口的根,让UISplitViewController管理主/辅列。需要iOS 18或更高版本以及Core的SplitView;测试的Core版本是9.1.3。选择 Android 上的现有自适应组件,或者在选项卡内嵌入拆分或其他布局时:
<script setup lang="ts">
import { supportsUIKitSplitView } from 'vue-router-ns'
const nativeColumns = supportsUIKitSplitView()
</script>
<template>
<RouterUIKitSplitView
v-if="nativeColumns"
name="inbox"
list="/messages"
:primaryWidthFraction="0.32"
/>
<RouterSplitView v-else name="inbox" list="/messages" />
</template>路由器插件注册这两个组件。每个都使用相同的路由表、原生页面、导航守卫、结果并保存为 导航栈 格式。在创建窗口时做出选择;它不是安装的 导航栈 之间的运行时切换。
UIKit 拥有折叠/展开及其系统侧边栏控件。扩展列使用 UIKit 的平铺布局。 primaryWidthFraction 是可用宽度的首选部分,受 UIKit 的限制。显示或隐藏主列仅更改显示:选择一个项目仍会调用 push(),添加详细信息并保留以前的选择。 Back 通过这些详细信息返回并最终清除详细信息列。原生 Back、受保护的解雇、模态和 restore 保留上述历史语义。列适应保持相同的页面及其本地状态。
对于实际的 iPad 窗口大小调整,允许 App_Resources/iOS/Info.plist 中的多任务处理并支持所有 iPad 方向:
<key>UIRequiresFullScreen</key>
<false/>全屏兼容模式可以缩放应用程序的表面,而无需为其提供较小的 UIKit 窗口。有关区别和测试版本,请参阅 native 接受矩阵和复制命令。
该组件公开 name、必需的 list 和 primaryWidthFraction(默认 0.32)。它的空细节是空白的;它没有 empty 槽、断点、补充或检查器列。它必须拥有窗口根:不要将其包装在 RouterDrawer、RouterTabs、Page 或其他布局中。主栏是该窗口的侧边栏;将 RouterDrawer 单独用于 Android 布局。现有的 RouterSplitView 在两个平台上仍然可用。