如何从 stack.navigation 之外的组件使用 navigation.navigate

Car*_*teu 11 react-native react-native-navigation

我有一个使用 React Native 的应用程序,我正在使用 react-navigation (5.2.9)。

我构建了一个 Stack.Navigator,我有我的屏幕,但我希望页脚组件在外面,以便它在所有屏幕中呈现。问题是,我无法从页脚导航,这是我需要做的,因为页脚有几个应该改变屏幕的按钮:

const Stack = createStackNavigator();

const App = () => {    
  return (
    <Provider store={store}>
      <NavigationContainer>
        <Header />
        <Stack.Navigator>
          <Stack.Screen
            name="Home"
            component={HomeScreen}
            options={{
            headerShown: false
          }}
          />
          <Stack.Screen
            name="Login"
            component={LoginScreen}
            options={{
            headerShown: false
          }}
          />
        </Stack.Navigator>
        <Footer />
      </NavigationContainer>
    </Provider>
  );
};
Run Code Online (Sandbox Code Playgroud)

如何将导航道具传递给页脚组件?

Sou*_*Odf 27

尝试这个:

创建一个名为:RootNavigation.js 的新文件

// RootNavigation.js

import * as React from 'react';

export const navigationRef = React.createRef();

export function navigate(name, params) {
  navigationRef.current?.navigate(name, params);
}
Run Code Online (Sandbox Code Playgroud)
// file where you have the navigation

import {navigationRef} from './path/to/RootNavigation';

      <NavigationContainer ref={navigationRef}>
      .....
        <Footer />
      </NavigationContainer>
Run Code Online (Sandbox Code Playgroud)

而 Footer.js 应该是这样的:

// Footer.js

import React from 'react';
import {View, Button} from 'react-native';
import * as RootNavigation from './path/to/RootNavigation';

const Footer= () => {
  return (
    <View>
      <Button
        title={'Go to'}
        onPress={() =>
          RootNavigation.navigate('screenName ', {userName: 'Lucy'})
        }
      />
    </View>
  );
};

export default Footer;
Run Code Online (Sandbox Code Playgroud)

有关更多信息,您可以阅读文档。https://reactnavigation.org/docs/navigating-without-navigation-prop/

  • 这不是我前一天回答的吗? (3认同)

Ben*_*rth 10

组件外部的Stack.Screen组件不接收导航道具。因此,在这种情况下,您必须NavigationContainer在页脚组件中获取using refs,如下所示:

  1. 创建一个引用 const myRef = React.createRef()
  2. 将其传递给<NavigationContainer ref={myRef}>,并且
  3. 使用该 ref 导航,myRef.current?.navigate(name, params)

这一切都在这里解释。此处的文档将 ref 在新文件中的创建分开,以允许您在没有依赖循环/问题的情况下导入 ref。正如文档所述,您现在可以RootNavigation.navigate('ChatScreen', { userName: 'Lucy' });在任何 js 模块中调用,而不仅仅是在 react 组件中。

但是,在您的情况下,您不需要单独文件中的 ref。

const Stack = createStackNavigator();
const navigationRef = React.createRef();

const App = () => {    
  return (
    <Provider store={store}>
      <NavigationContainer ref={navigationRef}>
        <Header />
        <Stack.Navigator>
          <Stack.Screen
            name="Home"
            component={HomeScreen}
            options={{
            headerShown: false
          }}
          />
          <Stack.Screen
            name="Login"
            component={LoginScreen}
            options={{
            headerShown: false
          }}
          />
        </Stack.Navigator>
        <Footer navigationRef={navigationRef}/>
      </NavigationContainer>
    </Provider>
  );
};
Run Code Online (Sandbox Code Playgroud)

并且在<Footer/>使用中navigationRef.current?.navigate(name, params)

  • 我发现这比批准的答案更容易遵循 (4认同)

小智 9

从文档中。 https://reactnavigation.org/docs/connecting-navigation-prop/

import * as React from 'react';
import { Button } from 'react-native';
import { useNavigation } from '@react-navigation/native';

function GoToButton({ screenName }) {
  const navigation = useNavigation();

  return (
    <Button
      title={`Go to ${screenName}`}
      onPress={() => navigation.navigate(screenName)}
    />
  );
}
Run Code Online (Sandbox Code Playgroud)

  • 显然我已经尝试过文档所说的内容,但这只会显示以下错误:无法找到导航.对象,您的组件是否在导航器的屏幕内? (5认同)