You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React Navigation Stack中读取完整栈路由信息?

如何在React Navigation中读取栈路由信息

当然可以读取栈的路由信息!React Navigation并没有提供navigation.ReadStack()这种方法,但它有两个更实用的方式来获取你需要的栈路由结构。

方法1:使用useNavigationState钩子

这个钩子是React Navigation专门用来获取导航状态的,但要注意它必须在组件的顶层作用域中调用,不能放在嵌套函数(比如你写的Pokus函数)里,否则会违反React Hooks的规则。

你可以把它移到Main组件的顶层,然后在需要的地方使用:

import React, { useState } from 'react';
import { StyleSheet, Text, View, Button } from 'react-native';
import { last_activity_token, UpdateActivity } from '../Models/activityModel';
import {useNavigationState} from '@react-navigation/native';

export default function Main({ navigation }) {
  const [activity, setActivity] = useState(new last_activity_token());
  // 将useNavigationState移到组件顶层
  const navigationState = useNavigationState(state => state);

  const Pokus = () => {
    // 转换为你想要的结构
    const formattedRoutes = navigationState.routes.map((route, index) => ({
      name: route.name,
      index: index
    }));
    alert(JSON.stringify(formattedRoutes));
  }
  
  React.useEffect(() => {
    activity.page.name = "Main";
    UpdateActivity(activity);
  }, []); // 建议添加空依赖数组,避免组件重复渲染时无限触发
  
  return (
    <View style={styles.layout}>
      <Text>Main</Text>
      <View style={styles.MainContent}>
        <Text>Tady se to vše bude odehrávat</Text>
        <Button title="查看路由栈" onPress={Pokus}/>
      </View>
    </View>
  );
}

// 样式部分保持不变
const styles = StyleSheet.create({
  layout: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
  MainContent: { marginTop: 20 }
});

方法2:使用navigation.getState()方法

如果你只是想在某个事件(比如按钮点击)中一次性获取路由栈信息,直接用navigation.getState()会更简单,不需要依赖钩子:

const Pokus = () => {
  const state = navigation.getState();
  const formattedRoutes = state.routes.map((route, index) => ({
    name: route.name,
    index: index
  }));
  alert(JSON.stringify(formattedRoutes));
}

这个方法可以直接在嵌套函数或事件处理程序中使用,灵活度更高。

关于返回的结构细节

不管用哪种方法,state.routes就是当前栈中所有路由的数组,每个路由对象包含你在Stack.Screen中定义的name、唯一标识key等属性。通过map转换后,就能得到你想要的[{ name: "Home", index: 0 }, { name: "Main", index: 1 }]这种结构。

另外补充一个小建议:你的useEffect没有设置依赖数组,会导致组件每次渲染都触发UpdateActivity,加上空数组[]可以让它只在组件挂载时执行一次。

内容的提问来源于stack exchange,提问作者Andrew Black

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:17:57