宁波制作网站公司,那个平台能免费做网站,网络营销教案ppt,工地模板图片大全在 Web 浏览器中#xff0c;您可以使用锚标记链接到不同的页面。当用户单击链接时#xff0c;URL 会被推送到浏览器历史记录堆栈中。当用户按下后退按钮时#xff0c;浏览器会从历史堆栈顶部弹出该项目#xff0c;因此活动页面现在是以前访问过的页面。React Native 不像 W…在 Web 浏览器中您可以使用锚标记链接到不同的页面。当用户单击链接时URL 会被推送到浏览器历史记录堆栈中。当用户按下后退按钮时浏览器会从历史堆栈顶部弹出该项目因此活动页面现在是以前访问过的页面。React Native 不像 Web 浏览器那样具有全局历史堆栈的内置概念而 React Navigation 就是帮助我们实现导航管理的工具。
React Navigation 的堆栈导航器为您的应用程序提供了一种在屏幕之间转换和管理导航历史记录的方法。如果您的应用程序仅使用一个堆栈导航器那么它在概念上类似于 Web 浏览器处理导航状态的方式 - 当用户与其交互时您的应用程序会从导航堆栈中推送和弹出项目这会导致用户看到不同的屏幕。React Navigation 的堆栈导航器提供了您在 Android 和 iOS 上在堆栈中的路由之间导航时所期望的手势和动画。
安装堆栈导航器
在上一篇文章中我们安装了导航器的构建模块和基础模块当我们需要堆栈导航器的话则需要安装如下包
npm install react-navigation/native-stack创建堆栈
首先我们先来看一个简单的实例
import React from react;
import Home from ./page/Home;
import { NavigationContainer } from react-navigation/native;
import { createNativeStackNavigator } from react-navigation/native-stack;const App: React.FC () {const Stack createNativeStackNavigator();return (NavigationContainerStack.NavigatorStack.Screen nameHome Page component{Home} //Stack.Navigator/NavigationContainer);
};export default App;运行后效果如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uDUJWkBl-1693035587956)(./images/ReactNavigation.png “ReactNavigation1”)]
从上述的例子我们可以看到我们使用了一个createNativeStackNavigator()方法来创建导航堆栈。createNativeStackNavigator是一个返回包含 2 个属性的对象的函数Screen 和 Navigator。它们都是用于配置导航器的 React 组件。应该 Navigator 包含 Screen 元素作为其子元素来定义路由的配置。
NavigationContainer 是管理导航树并包含导航状态的组件。该组件必须包装所有导航器结构。通常我们会在应用程序的根目录渲染此组件这通常是从 App.tsx 中进行绑定。
配置第二条导航路线
在上述的代码基础上改为如下代码
Stack.Navigator initialRouteNameHomeStack.Screen nameHome component{HomeScreen} /Stack.Screen nameDetails component{DetailsScreen} /
/Stack.Navigator现在我们的堆栈有两条路线一条 Home 路线和一条 Details 路线。可以使用组件来指定路线 Screen。该 Screen 组件接受一个 name 与我们将用于导航的路线名称相对应的 prop以及一个 component 与它将渲染的组件相对应的 prop。
现在路由导航中Home 路由对应组件 HomeDetails 路由对应组件 DetailsScreen。
注意 Stack.Screen组件中的component接受组件而不是渲染函数不要传递内联函数例如component{() 组件 /}否则当父组件重新渲染时您的组件将卸载并重新安装从而丢失所有状态。请参阅传递额外的 props 以获取替代方案。
Stack.Screen 说明
Stack.Screen组件除了name和component属性外还可以使用options来设置其他参数属性具体实例如下
Stack.NavigatorStack.ScreennameHome Pagecomponent{Home}options{{ title: Overview }}/Stack.Screen nameDetail Page component{ReviewDetails} /
/Stack.Navigator有时候我们可能想将额外的参数传递给对应的组件我们有如下两个方式来实现 使用 React context 并使用 context 提供程序包装导航器以将数据传递到屏幕推荐 对屏幕使用渲染回调而不是指定 componentprop Stack.Screen nameHome{(props) HomeScreen {...props} extraData{someData} /}
/Stack.Screen导航切换
首先我们举一个例子
export default function Home(props: { navigation: any }) {return (ViewTextHome/TextButtontitle切换到详情页onPress{() props.navigation.navigate(Detail Page)}//View);
}实现上述代码后我们点击按钮后页面会切换到详情页。接下来我们来说明一下具体的参数 navigation 本机的堆栈导航器对象数据并且每个组件都会带有此属性 navigate(‘Detail Page’) 调用此函数可以帮我们把页面跳转到对应名称组件的页面
**注意**如果我们在使用navigation.navigate进行页面跳转的时候跳转没有定义的路由时开发环境下会报出对应的错误信息但是打包的生产环境不会有任何反映。
路由循环
现在我们有两条路由那么我们再进入详情页后在重新导航到详情页那么会发生什么我们用如下的代码实现验证一下
export default function ReviewDetails(props: { navigation: any }) {return (ViewTextReviewDetails/TextButtontitle切换到详情页onPress{() props.navigation.navigate(Detail Page)}//View);
}运行上述代码后你会发现当点击切换到详情页时不会发生任何操作并且点击返回后我们可以直接一次性返回到首页。因为当我们在首页点击切换到详情页后我们的路由线路会跳转到详情页上在当我们点击切换到详情页时程序会判断是否在详情页路由线上假如在的话就不会做任何操作。
假设我们实际上想要添加一个新的详情页路由时并且不管现有的导航历史记录如何的情况下我们可以使用push来实现。具体实例如下
ViewTextReviewDetails/TextButtontitle切换到详情页onPress{() props.navigation.push(Detail Page)}/
/View每次您调用时push 我们都会向导航堆栈添加一条新路线。当您 navigate 第一次调用它时它会尝试查找具有该名称的现有路由并且仅在堆栈上还没有路由时才推送新路由。
编程式导航
有时候我们可能会遇到头部导航没有返回按钮的情况这时我们就可以使用goBack()方法来实现返回上一级路由的功能具体代码实例如下
Button title返回上一页 onPress{() props.navigation.goBack()}/Button还有就是我们想清除所有路由信息并返回第一个页面具体代码如下
Buttontitle清除所有堆栈信息返回首页onPress{() props.navigation.popToTop()}
/Button