Manual Routing
在NativeScript-Vue中实现路由的最简单方法是使用以下任何便利函数:
对于更复杂的导航场景,您可以使用多个<Frame>组件和导航专用组件:
基本导航概念
NativeScript所依赖的导航元素包括Frame和Page.
Frame它是主要的导航元素,根据应用程序的设计,它可以有一个或N个。在声明之前声明此元素很重要Page.Page。这些是Frame将在两者之间导航。
浏览的基本应用程序结构如下。
// App.vue
<script lang="ts" setup>
import Detail from "./Detail.vue"
</script>
<template>
<Frame>
<Page>
<StackLayout>
<Button text="Navigate to Detail Page" @tap="$navigateTo(Detail)" />
</StackLayout>
</Page>
</Frame>
</template>请注意,在App.vue组件中Frame被声明,里面有一个Page。当用户按下按钮时,他们将导航到Detail组件。
// Detail.vue
<template>
<Page>
<StackLayout>
<Label text="Navigation to Detail component completed" />
</StackLayout>
</Page>
</template>如您所见,细节组件没有Frame元素,但它确实有Page组件,这是因为NativeScript将使用FrameApp.vue中声明的元素,用于导航到Detail组件页面。
这只是理解NativeScript中导航如何工作的一个基本但有用的示例。
查看导航
使用$navigateTo在视图或方法中。
在视图中
在theMaster组件,使用adata财产暴露Detail组件。援引$navigateTo(<propertyName>)直接在视图中。
// Master.vue
<script lang="ts" setup>
import Detail from "./Detail.vue"
</script>
<template>
<Frame>
<Page>
<ActionBar title="Master" />
<StackLayout>
<Button text="To Detail directly" @tap="$navigateTo(Detail)" />
</StackLayout>
</Page>
</Frame>
</template>在一种方法中
将按钮绑定到方法并使用$navigateTo(Detail)导航到Detail组件。
// Master.vue
<script lang="ts" setup>
import { $navigateTo } from "nativescript-vue"
import Detail from "./Detail.vue"
function goToDetailPage(){
$navigateTo(Detail);
}
</script>
<template>
<Frame>
<Page>
<ActionBar title="Master" />
<StackLayout>
<Button text="To Detail directly" @tap="goToDetailPage" />
</StackLayout>
</Page>
</Frame>
</template>将道具传递给目标组件
通过aprops实例化目标组件时使用的对象。
$navigateTo(Detail, {
props: {
foo: 'bar',
}
});听从目标组件发射
传递前缀为的侦听器属性on听你的emit目标事件。
// Master.vue
$navigateTo(Detail, {
props: {
onChange(data){
// logic here
},
}
});// Detail.vue
<script lang="ts" setup>
const emit = defineEmits(["change"])
function goToDetailPage(){
emit("change", { foo: "bar" })
}
</script>有关可以传递的选项的更多信息,请参阅NavigationEntry.
指定转换
您可以使用任何内置的过渡:
- curl(与curlUp相同)(仅限iOS)
- curlUp(仅限iOS)
- curlDown(仅限iOS)
- 爆炸(仅限安卓棒棒糖(21)及以上版本)
- 褪色
- flip(与flip-Right相同)
- flip-right
- 翻转左
- slide(与slideLeft相同)
- slide左
- slideRight
- slideTop
- slide底部
例如:
$navigateTo(Detail, {
transition: {
name: "slideLeft",
duration: 300,
curve: "easeIn"
},
transitioniOS: {},
transitionAndroid: {},
});在框架内导航
每个<Frame>元素有自己的导航堆栈。如果您正在使用多帧,您可能希望指定导航将在哪个框架中发生。例如,在侧栏中有一个按钮,可以更改主区域中的页面。您可以通过添加frame选项:
$navigateTo(SomeComp, {
frame: '<id, or ref, or instance>'
});的价值frame选项可以是以下选项之一:
- 这个
id的<Frame>组件(例如:<Frame id="main-frame">) - 这个
ref对于<Frame>(例如:<Frame ref="mainFrame">) - 这个
<Frame>实例本身
$navigateBack(options, backstackEntry = null)
在theDetail组件,添加一个触发全局公开的按钮$navigateBack功能。
//Detail.vue
<template>
<Page>
<ActionBar title="Detail" />
<StackLayout>
<Button text="Back to Master" @tap="$navigateBack" />
</StackLayout>
</Page>
</template>模态视图导航
使用$showModal显示Detail页面模式。此函数的行为类似于$navigateTo.
要关闭模式,请调用$modal.close.
//Master.vue
<script lang="ts" setup>
import { $showModal } from "nativescript-vue"
import Detail from "./Detail.vue"
function showDetailPageModally(){
$showModal(Detail);
}
</script>
<template>
<Frame>
<Page>
<ActionBar title="Master" />
<StackLayout>
<Button text="Show Detail modally" @tap="showDetailPageModally" />
</StackLayout>
</Page>
</Frame>
</template>// Detail.vue
<template>
<Frame>
<Page>
<ActionBar title="Detail" />
<StackLayout>
<Button @tap="$modal.close" text="Close" />
</StackLayout>
</Page>
</Frame>
</template>注意:我们已将“详细信息”页面包裹在<Frame>元素,它允许我们展示<ActionBar>以及在模态中进一步导航。
将道具传递给模态
$showModal接受第二个参数。您可以使用该参数传入props对象到目标组件。例如:
$showModal(Detail, { props: { id: 14 }});强制模式全屏显示
此选项仅在Android上有效,因为iOS模式始终是全屏的。
$showModal(Detail, { fullscreen: true, props: { id: 14 }});从模态返回数据
通话时$showModal,返回一个promise,该promise将解析传递给$modal.close功能。
在以下示例中,关闭控制台中的模态输出'Foo'。
// ... inside Master
$showModal(Detail, {
closeCallback(data, ...args) {
// data type is any
// args type is any[]
}
});<!-- inside Detail -->
<Button @tap="$modal.close('Foo')" text="Close" />