首页 > 其他分享 >React-Navigation基础知识

React-Navigation基础知识

时间:2024-01-29 15:34:06浏览次数:18  
标签:导航 navigate 基础知识 React 嵌套 Navigation 屏幕 navigation

React Navigation在App中创建导航结构
Web浏览器中,可以通过a链接到不同的页面,当用户按下后退按钮,浏览器从访问记录堆栈中弹出项目
RN无法像浏览器一样管理访问路由,需要通过React Navigation实现
React Navigation的本机堆栈导航器为App提供一种在屏幕之间转换和管理导航历史记录的方法
Android上,React Navigation挂钩到硬件后退出,并goBack()在用户按下它时触发该功能

将参数传递给路由

  1. 通过该参数放入对象中作为函数的第二个参数传递给路由 navigation.navigate: navigation.navigate('RouteName',
  2. 读取屏幕组件中的参数:route.params
    Note: 传递的参数是JSON可序列化的,这样可以使用状态持久性,并且屏幕组件将具有用于实现深度链接的正确契约
      <Button color="success" onPress={() => {
        navigation.navigate(
          'Details',
          {
            itemId: 86,
            otherParam: 'anything you want here!'
          }
        )
      }}>

初始参数

可以将一些初始参数传递到屏幕,在导航到此屏幕上未指定任何参数时生效
在prop上指定initialParams

<Stack.Screen
  name='Details'
  component={DetailScreen}
  initialParams={{ itemId: 42 }}
/>

参数回传

navigation.navigate({
  name: 'Home',
  params: { post: postText },
  merge: true
});

参数内容规范

  • 错误案例(反模式)
// Don't do this
navigation.navigate('Profile', {
  user: {
    id: 'jame',
    firstName: 'Jane',
    lastName: 'Done',
    age: 25,
  }
});

这是一种反模式,可以能会导致显示过时数据
更好的方法是参数中仅仅传递用户ID

navigation.navigate('Profile', {userId: '80a808sda808ds0812'}
规范案例
1. ID, eg: 用户ID、项目ID等,eg: navigation.navigate('Profile', { userId: 'Jane'})
2. 当存在一个项目列表的时候,用于排序、过滤数据等的参数, eg: navigation.navigate('Feeds',{ sortBy: 'latest'})
3. 时间戳、页码或分页光标, eg: navigation.navigate('Chat', { beforeTime: 435612089})
4. 用于填充屏幕上输出以组成某些内容的数据, eg: navigation.navigate('ComposeTweet', {title: 'Hello World!'})

★ 将App数据和导航状态分开

传递给函数的参数options是具有一下属性的对象:

  1. navigation - 屏幕的导航道具
  2. route - 屏幕的路线道具

更新 options setOptions

/* Inside of render() of React class */
<Button
  title='Update the title'
  onPress={() => navigation.setOptions({ title: 'Updated!'})}
/>

调整标题

自定义标题样式需要使用三个关键属性:headerStyle、headerTintColor和headerTitleStyle

  • headerStyle: 将应用于View包装标题样式对象
  • headerTintColor: 后退按钮和标题都使用此属性作为颜色,
  • headerTitleStyle: 自定义标题样式 fontFamily、fontWeight等样式Text属性
function StackScreen() {
  return (
    <Stack.Navigator
      name='Home'
      component={HomeScreen}
      options={{
        title: 'My Home',
        headerStyle: {
          backgroundColor: '#3ab09e'
        },
        headerTintColor: '#fff',
        headerTitleStyle: {
            fontWeight: 'bold',
        },
      }}
    >
    </Stack.Navigator>
  )
}

实现options在多个screen页面共享

   <Stack.Navigator
      screenOptions={{
        headerStyle: {
          backgroundColor: '#f4511e',
        },
        headerTintColor: '#fff',
        headerTitleStyle: {
          fontWeight: 'bold',
        },
      }}
    >
      <Stack.Screen
        name="Home"
        component={HomeScreen}
        options={{ title: 'My home' }}
      />
    </Stack.Navigator>

headerTitle提供组件而不是title那样?headerTitle是一个特定于标题的属性而title将用于选项卡栏、抽屉等
默认headerTitle为Text显示title

headerRight 使用带有处理程序的按钮来更新onPress,该处理程序可以访问组件的状态并可以更新它

嵌套导航器

嵌套导航器意味着在另一个导航器的屏幕内渲染另一个导航器

function Home() {
  return (
    <Tab.Navigator>
      <Tab.Screen name='Feed' component={Feed}/>
      <Tab.Screen name='Message' component={Message}/>
    </Tab.Navigator>
  )
}

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigation>
        <Stack.Screen
          name="Home"
          component={Home}
          options={{ headerShown: false}}
        />
        <Stack.Screen name="Profile" component={Profile}/>
        <Stack.Screen name="Settings" component={Setting}/>
      </Stack.Navigator>
    </NavigationContainer>
  )
}

* Stack.Navigator
  - Home(Tab.Navigator)
    - Feed(Screen)
    - Message(Screen)
  - Profile(Screen)
  - Settings(Screen)

嵌套导航的最佳实践

将嵌套导航器减少到最少,尽可能少的嵌套来实现想要的行为

  • 可能会导致深度嵌套的视图层次结构,可能会导致低端设备中的内存和性能问题
  • 嵌套相同类型的导航器(eg: 选项卡、抽屉)导致用户体验混乱
  • 如果嵌套太多,当导航到嵌套屏幕、配置深层链接的时候,代码会变得难以理解

将嵌套导航器视为实现所需的UI的一种方式,而不是组织代码的一种方式

<Stack.Navigator>
  { isLoggedIn ? (
      // Screens for logged in users
      <Stack.Group>
        <Stack.Screen name="Home" component={Home}/>
        <Stack.Screen name="Profile" component={Profile}/>
      </Stack.Group>
    ) : (
      // Auth screens
      <Stack.Group screenOptions={{ headerShown: false }}>
        <Stack.Screen name="SignIn" component={SignIn}/>
        <Stack.Screen name="SignUp" component={SignUp}/>
      </Stack.Group>
    ) }
    {/* Common modal screens */}
    <Stack.Group screenOptions={{ presentation: 'modal'}}>
      <Stack.Screen name="Help" component={Help}/>
      <Stack.Screen name="Invite" component={Invite}/>
    </Stack.Group>
</Stack.Navigator>

导航生命周期

使用一个具有两个屏幕(Home和Details)的堆栈导航器并学习如何使用navigation.navigate('RouteName')在路线之间导航

可以通过监听focus和blur事件分别了解屏幕何时进入焦点或失焦

function Profile({ navigation }) {
  React.useEffect(() => {
    const unsubscribe = navigation.addListener('focus', () => {
      // Screen was focused
      // Do sth...
    });
  }, [navigation]);
 
  return <ProfileContent/>
}

useFocusEffect可使用钩子来执行副作用,而不是手动添加事件监听器,就像React的useEffect钩子
它和导航生命周期相关

import { useFocusEffect } from '@react-navigation/native';
function Profile() {
  useFocusEffect(
    React.useCallback(() => {
      // Do sth when the screen is focused
      // Useful for cleanup functions
    }, [])
  );
  
  return <ProfileContent/>;
}

根据屏幕是否聚焦来渲染不同的内容,可以使用useIsFocused返回一个布尔值来指示屏幕是否聚焦的钩子

标签:导航,navigate,基础知识,React,嵌套,Navigation,屏幕,navigation
From: https://www.cnblogs.com/openmind-ink/p/17994624

相关文章

  • LangChain大模型应用开发指南:从基础链式结构到ReAct对话解构
    在自然语言处理领域,大模型的应用已经成为了一种趋势。LangChain是一个基于深度学习的自然语言处理框架,它通过使用链式结构和ReAct对话模型,为开发者提供了一种高效、灵活的方式来进行大模型应用开发。本指南将介绍如何从基础链式结构开始,逐步构建ReAct对话解构,以实现自然语言处理应......
  • 常见的电子元器件基础知识,带图详情!
    欢迎进入电子元器件的广阔世界!以下是电子元器件的基础知识,道合顺帮助您更好地了解这个引领科技发展的关键领域。1.电阻(Resistor):电阻是电子电路中常见的元件,用于限制电流流动。电阻值: 电阻的阻值以欧姆(Ω)为单位,表示电阻对电流的阻碍程度。功率: 电阻器的功率表示它能承受的最大功......
  • 正则表达式基础知识
    一个正则表达式就是由普通字符(例如字符a到z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。如:JScriptVBScript匹配/^\[\t]*$/"^\[\t]*$"匹配一个空白......
  • STM32的汇编基础知识
    一、STM32F1内核基础知识1.Cortex-M3 内核结构STM32F1使用的是属于ARMv7-M架构的ARMCortex-M3内核,是一个32位的处理器内核,其内部的数据路径是32位的、寄存器是32位的以及存储器接口也是32位的。并且使用了哈佛结构,拥有独立的指令总线和数据总线为数字信号的处理提供了较高的性......
  • 安卓开发(二):Android基础知识
    摘录自Android官方文档Intent和Intent过滤器:https://developer.android.google.cn/guide/components/intents-filters?hl=zh-cn安卓按钮:https://developer.android.com/guide/topics/ui/controls/button?hl=zh-cn安卓Bitmap:https://developer.android.com/reference/......
  • 创建react基础项目所遇到的坑
    1.第一个就是创建开发环境,一般是使用的命令npxcreate-react-app(你的姓名名称),例如npxcreate-react-appreact-basic,这样等命令执行结束之后就会有这个react开发的环境了遇到的问题:1.命令执行缓慢 解决办法:更换镜像源,可以多搜搜镜像源,找到有用的执行命令修改     ......
  • Part 5:NetOps团队的 SecOps和网络安全基础知识
    转载为了弥合NetOps和SecOps团队之间的差距,网络专业人员应该了解安全基础知识,包括不同类型的破坏者和可用的安全服务。尽管网络和安全对于彼此以及业务运营都至关重要,但网络运营和安全运营团队(分别为NetOps和SecOps)通常是孤立的。如果不完全了解SecOps团队的工作,NetOps团队可能无......
  • [office] vba是什么?本文给大家介绍vba是什么,以及VBA相关的一些基础知识
    vba是什么呢?VBA是微软研发出来的,但是并不是仅仅用于微软的产品(Word、Excel、PowerPoint等),在其他的商业软件中,也有不少集成了VBA,比如AutoCAD,WordPerfect等,在这些应用软件中,也可以使用VBA。到底VBA是什么呢?VBA的全称是VisualBasicforApplication。VBA是MicrosoftVisual......
  • Reactor和Proactor
    目录Reactor模型Proactor模型总结实际应用优缺点示例Reactor模型和Proactor模型都是用于处理异步I/O操作的并发模型,它们在设计和实现上有一些区别。Reactor模型Reactor模型(反应器模型)是一种基于事件驱动的并发模型,主要用于处理网络通信等I/O密集型任务。在Reactor模......
  • React中的Key属性的作用
    在React中,我们常常会遇到需要渲染列表或循环生成组件的场景。为了提高性能和优化用户体验,React引入了一个特殊的属性——key。本文将详细介绍React中key属性的作用、原理,并提供一些最佳实践。一、Key属性的作用Key属性是React要求使用者在渲染多个组件时提供的一个特殊属性。它的作......