reactjs this.props.navigation.navigate()不起作用(使用WithNavigation)

kb5ga3dv  于 2023-04-29  发布在  React
关注(0)|答案(5)|浏览(153)

我已经实现了一个弹出窗口组件在一个标题与更多的选项按钮。此按钮仅在UserProfileScreen上可用。当你按下它时,你会看到两个按钮:“设置”和“注销”。问题与设置按钮有关。

**预期行为:**按“设置”按钮-〉this。props.navigation.navigate('SettingsNavigator')被调用-〉显示SettingsScreen
**实际行为:**按下设置按钮-〉控制台。warn('go to settings')被调用,仅此而已(您不会被重定向到SettingsScreen)。
设置导航器。js

import React from 'react';
import { createStackNavigator } from 'react-navigation';

import SettingsScreen from './SettingsScreen';
import EditProfileScreen from './EditProfileScreen';
import RemoveProfileScreen from './RemoveProfileScreen';

const SettingsNavigator = createStackNavigator({
    SettingsScreen: SettingsScreen,
    EditProfile: EditProfileScreen,
    RemoveProfile: RemoveProfileScreen
}, {
    initialRouteName: 'SettingsScreen'
});

export default SettingsNavigator;

optionHeaderButton。js

import { withNavigation } from 'react-navigation';
...

class OptionsHeaderButton extends Component {

    ...

    navigateToSettings = () => {
        console.warn('go to settings')
        this.props.navigation.navigate('SettingsNavigator');
    }

    render() {
    return(
        <Menu onSelect = {value => {
            switch(value) {
                case 'Settings':
                    this.navigateToSettings();
                    break;
                case 'Logout':
                    this.onLogOutPress();
                    break;
            }
        }}>

            <MenuTrigger>
                <Icon name = 'dots-vertical' size = {24} color = {text}/>
            </MenuTrigger>

            <MenuOptions style = {optionsHeaderButtonStyle.menuWrapper}>

                <MenuOption value = {'Settings'}>
                    <View style = {optionsHeaderButtonStyle.optionWrapper}>
                        <View style = {optionsHeaderButtonStyle.optionIcon}>
                            <IconSimpleLine name = 'settings' size = {12} color = {text}/>
                        </View>
                        <Text style = {[optionsHeaderButtonStyle.option, optionsHeaderButtonStyle.lastOption]}>
                            Settings
                        </Text>
                    </View>
                </MenuOption>

                <MenuOption value = {'Logout'}>
                    <View style = {optionsHeaderButtonStyle.optionWrapper}>
                        <View style = {optionsHeaderButtonStyle.optionIcon}>
                            <IconSimpleLine name = 'logout' size = {12} color = {text}/>
                        </View>
                        <Text style = {[optionsHeaderButtonStyle.option, optionsHeaderButtonStyle.lastOption]}>
                            Logout
                        </Text>
                    </View>
                </MenuOption>

            </MenuOptions>

        </Menu>
    )
}
}

export default withNavigation(OptionsHeaderButton);

OptionsHeaderButton嵌套到嵌套在UserProfile组件中的Header组件。
据我所知,使用withNavigation(),我可以从任何组件调用navigation.navigate()。那为什么不起作用呢

更新:

经过调查,我发现这个问题与2017年4月发现的React Navigation的一个bug有关。这意味着你只能在一个堆栈中使用navigation.navigate()。但我找不到任何有关修复此错误的信息。

x3naxklr

x3naxklr1#

你需要传递屏幕名称而不是导航器。

this.props.navigation.navigate('SettingsSecreen');
bprjcwpo

bprjcwpo2#

试试这个:

import { NavigationActions, withNavigation } from 'react-navigation';


navigateToSettings = () => {
  const navigateAction = NavigationActions.navigate({ routeName: 'SettingsScreen' });
  this.props.navigation.dispatch(navigateAction);
}
6yjfywim

6yjfywim3#

我有这个问题,但我已经连接了我的应用程序。js使用堆栈导航和抽屉式导航(以及auth的切换导航)略有不同-主要遵循react导航文档:

App.js

const AuthStack = createStackNavigator({ Login: Login }, { headerMode: 'none' });
const ActivityStack = createStackNavigator({ Activity: ActivityScreen}, {headerMode: 'none'});

// setup my routing & config here

export default createAppContainer(createSwitchNavigator(
{
   Auth: AuthStack,
   ActivityStack: ActivityStack,
},
{
   intitalRouteName: 'Auth',
},
));

在我想要导航的屏幕中,我像这样连接构造函数(以绑定导航函数):

第一屏幕。js

export default class FirstScreen extends React.Component {
  constructor(props) {
    super(props);

    this.navigateToScreen = this.navigateToScreen.bind(this);
  }

state = {
   // state items here
}

  navigateToScreen(screenName) {
    this.props.navigation.navigate(screenName);
  }

  render() {
    return (
      <View style={styles.container}>
        <TouchableOpacity style={styles.button} onPress= 
              {this.navigateToScreen("Activity")}>
          <Text style={styles.loginText}>
            ADD ACTIVITY
          </Text>
        </TouchableOpacity>
      </View>

请注意我是如何调用导航的,我只是在应用程序中传递了我前面给出的路由别名。js文件:

Activity: ActivityStack,

所以我会从调用点写入this.navigateToScreen("Activity"),传递别名,而不是屏幕名或堆栈名。
这将正确地导航到屏幕,并利用我之前在App中定义的堆栈导航。js。
希望这是有意义的(父/子层次结构是通过嵌套各种导航功能,如开关、堆栈和抽屉来实现的,以达到您想要的结果。

tvz2xvvm

tvz2xvvm4#

在react-navigation版本中:5.x withNavigation不起作用。要解决此问题,请尝试此操作。

import { useNavigation } from '@react-navigation/native';
const navigation = useNavigation();
navigation.navigate("DetailsScreen")

不需要在withNavigation中扭曲组件。
希望这可能有所帮助。

vom3gejh

vom3gejh5#

在某些情况下使用导航。push()代替navigation。navigate()解决了这个问题。

navigateToSettings = () => {
   this.props.navigation.push('SettingsNavigator');
}

有关详细说明,请转到此问题链接:https://github.com/react-navigation/react-navigation/issues/9182

相关问题