Vue 导航
本指南涵盖了在使用 Ionic 和 Vue 构建的应用中路由的工作原理。
IonRouterOutlet 组件底层使用了流行的 Vue Router 库。通过 Ionic 和 Vue Router,您可以创建具有丰富页面过渡效果的多页面应用。
您所了解的关于使用 Vue Router 进行路由的所有知识都可以应用到 Ionic Vue 中。让我们看看 Ionic Vue 应用的基础知识以及路由是如何与之配合工作的。
简要说明
在阅读本指南时,您可能会注意到这些概念中的大部分与没有 Ionic Framework 的 Vue Router 中的概念非常相似。您的观察是正确的!Ionic Vue 利用了 Vue Router 的最佳部分,使得使用 Ionic Framework 构建应用的过渡尽可能无缝。因此,我们建议尽可能依赖 Vue Router 的功能,而不是尝试构建自己的路由解决方案。
一个简单的路由
这是一个示例路由配置,它定义了一个指向 "/home" URL 的单一路由。当您访问 "/home" 时,该路由会渲染 HomePage 组件。
router/index.ts
import { createRouter, createWebHistory } from '@ionic/vue-router';
import { RouteRecordRaw } from 'vue-router';
import HomePage from '@/views/Home.vue';
const routes: Array<RouteRecordRaw> = [
{
path: '/',
name: 'Home',
component: HomePage,
},
];
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes,
});
export default router;
在应用初始加载时,应用将渲染 HomePage 组件,因为这是此处配置的。
处理重定向
如果我们想在初始加载时访问一个不同的路径该怎么办?为此,我们可以使用路由重定向。重定向的工作方式与典型的路由对象相同,但包含一些不同的键:
const routes: Array<RouteRecordRaw> = [
{
path: '/',
redirect: '/home',
},
{
path: '/home',
name: 'Home',
component: HomePage,
},
];
在重定向中,我们查找应用的索引路径。然后,如果我们加载该路径,我们会重定向到 home 路由。
导航到不同路由
这一切都很好,但是如何实际地导航到一个路由呢?为此,我们可以使用 router-link 属性。让我们创建一个新的路由设置:
const routes: Array<RouteRecordRaw> = [
{
path: '/',
redirect: '/home',
},
{
path: '/home',
name: 'Home',
component: HomePage,
},
{
path: '/detail',
name: 'Detail',
component: DetailPage,
},
];
假设我们从 home 路由开始,我们想要添加一个按钮,带我们进入 detail 路由。我们可以使用以下 HTML 导航到 detail 路由:
<ion-button router-link="/detail">前往详情页</ion-button>
我们也可以通过使用路由器 API 在应用中编程式导航:
<template>
<ion-page>
<ion-content>
<ion-button @click="() => router.push('/detail')">前往详情页</ion-button>
</ion-content>
</ion-page>
</template>
<script setup lang="ts">
import { IonButton, IonContent, IonPage } from '@ionic/vue';
import { useRouter } from 'vue-router';
const router = useRouter();
</script>
这两种选项都提供了相同的导航机制,只是适用于不同的用例。
使用 router-link 导航
router-link 属性可以设置在任何 Ionic Vue 组件上,当点击该组件时,路由器将导航到指定的路由。router-link 属性接受字符串值以及命名路由,就像 Vue Router 的 router.push 一样。为了获得更多控制,还可以设置 router-direction 和 router-animation 属性。
router-direction 属性接受 "forward"、"back" 或 "root" 这些值,用于控制页 面过渡的方向。
router-animation 属性接受一个 AnimationBuilder 函数,用于提供一个自定义的页面过渡效果,该效果仅在点击提供该属性的组件时使用。AnimationBuilder 类型是一个返回 Ionic Animation 实例的函数。有关在 Ionic Vue 中使用动画的更多信息,请参阅 动画文档。
<ion-button router-link="/page2" router-direction="back" :router-animation="myAnimation">点击我</ion-button>
使用 useIonRouter 导航
使用 router-link 的一个缺点是无法在导航之前运行自定义代码。这使得诸如在导航之前发起网络请求之类的任务变得困难。您可以直接使用 Vue Router,但那样会失去控制页面过渡的能力。这就是 useIonRouter 实用工具有用的地方。
useIonRouter 实用工具是一个函数,它提供了编程式导航的方法,同时完全控制页面过渡。这使得在导航之前运行自定义代码变得容易。
第一个例子让我们将一个新页面推入堆栈,并使用自定义页面过渡:
import { useIonRouter } from '@ionic/vue';
import { customAnimation } from '@/animations/customAnimation';
const ionRouter = useIonRouter();
ionRouter.push('/page2', customAnimation);
useIonRouter 提供了便捷的 push、replace、back 和 forward 方法,以便轻松使用常见的导航操作。它还提供了一个 navigate 方法,可用于更复杂的导航场景:
import { useIonRouter } from '@ionic/vue';
import { customAnimation } from '@/animations/customAnimation';
const ionRouter = useIonRouter();
ionRouter.navigate('/page2', 'forward', 'replace', customAnimation);
上面的例子让应用使用自定义动画导航到 /page2,该动画使用了前进方向。此外,replace 值确保应用在导航时替换当前历史记录条目。
useIonRouter 使用 Vue 的 inject() 函数,因此只应在您的 setup() 函数内部使用。
更多细节和类型信息,请参阅 useIonRouter 文档。
使用 router.go 导航
Vue Router 有一个 router.go 方法,允许开发者在应用历史中向前或向后移动。让我们看一个例子。
假设您有以下应用历史记录:
/pageA --> /pageB --> /pageC
如果您在 /pageC 上调用 router.go(-2),您将被带回到 /pageA。然后如果您调用 router.go(2),您将被带到 /pageC。
router.go() 的一个关键特性是它期望您的应用历史记录是线性的。这意味着 router.go() 不应该在使用非线性路由的应用中使用。有关更多信息,请参阅 线性路由与非线性路由。