无法在 ReactNative 中使用 StackNavigator

IT技术 reactjs react-native react-redux react-navigation
2021-05-15 12:57:03

我正在尝试在以下页面中创建一个简单的导航:

第1页:

import React, { Component } from 'react';
import { Text, View, TouchableOpacity, Alert } from 'react-native';

import { StackNavigator } from 'react-navigation';
import { connect } from 'react-redux';

var styles = require('./styles');


class Page1 extends Component {
  static navigationOptions = {
    header: null
  };

componentDidMount() {      // <== Edited
   setTimeout(function() { 
    const { navigate } = this.props.navigation;
    },4000);
 }
  render() {

      const { navigate } = this.props.navigation;  // <= Getting error here

      const { fname, lname } = this.props.person;

    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          From Page 1 - {lname} { fname}
        </Text>
        <TouchableOpacity
          // onPress={() => this.props.navigation.navigate('Page2', { user: 'Lucy' }) }
        >
        <Text style={styles.welcome}> click for Page 2</Text>
        </TouchableOpacity>
      </View>
    );
  }
}

function mapStateToProps(state) {
  return {
    person:state.person
  }
}


export default connect(mapStateToProps) (Page1);

第 3 页:

import React, { Component } from 'react';
import { Text, View } from 'react-native';

import Page1 from './Page1'

import { Provider, connect } from 'react-redux'
import configureStore from './store'

const store = configureStore()

export default class Page3 extends Component {
  render() {
    return (
      <Provider store={store}>
        <Page1 /> 
      </Provider>     
    );
  }
}

在索引页面中,我正在导入 Page1、Page2 和 Page3 以及:

const SimpleApp = StackNavigator({
  Page1: { screen: Page1 },
  Page2: { screen: Page2 },
  Page3: { screen: Page3 },
});
AppRegistry.registerComponent('my03', () => SimpleApp);

除非我发表评论,否则该应用程序运行良好const { navigate } = this.props.navigation;我收到以下错误:

在此处输入图片说明

未定义不是一个对象(评估'this.props.navigation.navigate')

我也试过: onPress={() => this.props.navigation.navigate('Page2', { user: 'Lucy' }) }onPress={() => navigation.navigate('Page2', { user: 'Lucy' }) }

不太确定我为什么尝试它,但会弄清楚它是否有效。它没。

我正在尝试使用ReactNavigation而不为它创建减速器,因为即使尝试了 2 天后我也不理解这部分

为什么这在这里失败?请帮忙。

非常感谢。

更新1

import React, { Component } from 'react';
import { AppRegistry, Text, View } from 'react-native';

import { StackNavigator } from 'react-navigation';

import Page1 from './src/components/Page1'
import Page2 from './src/components/Page2'
import Page3 from './src/components/Page3'

const SimpleApp = StackNavigator({
  Page3: { screen: Page3 },
  Page2: { screen: Page2 },
  Page1: { screen: Page1 },
});

AppRegistry.registerComponent('my03', () => SimpleApp);
1个回答

简短的回答。就这样做。<Page1 navigation={this.props.navigation} />

说明 -this.props.navigation未定义的原因是您实际上是在Page 1内部使用组件的另一个实例,Page 3而不是用于初始化的实例StackNavigator所以它是一个全新的,完全Page 1没有与 StackNavigator 耦合的。如果Page 1将是您的StackNavigator. 那么this.props.navigation就不会是未定义的,这让我想到了另一个兴趣点。

为什么你会嵌套Page 1在里面,Page 3但想要Page 3在你的 React 导航堆栈中使用与兄弟相同的页面这个想法是在我们的StackNavigatoras 屏幕中添加组件,而不是将它们嵌套在一起,我们使用this.props.navigation.navigate其中任何一个屏幕从一个屏幕移动到另一个屏幕因此,因此,我们Page 3将拥有我们的navigationprops(因为我假设它首先通过StackNavigator直接加载)我们只需将该props传递给我们的嵌套Page 1组件和中提琴!您现在可以访问this.props.navigation您的Page 1.

另外,因为你Page 3<Provider >标签,我假设它更像是一个根。在这种情况下,您最好使用<SimpleApp >代替<Page1 >并保留Page 1作为堆栈的起点。然后您可以将您的根组件注册为AppRegistry.registerComponent('my03', () => Page3);

最后一条信息,你可以让你的 redux 状态和你的导航完全分离,所以只有当你绝对确定你的 redux store 中需要你的导航状态时才使用 redux 集成。同时具有 Redux 和 ReactNavigation 的项目并不意味着您必须将它们都集成。它们可以完全分开。

呼!希望能帮助到你!:)