【问题标题】:undefined is not an object (evaluating this.props.navigation.navigate)undefined 不是对象(评估 this.props.navigation.navigate)
【发布时间】:2017-09-18 17:01:36
【问题描述】:

我第一次尝试学习 React Native。我尝试引入 stacknavigator,但 const {navigate} = this.props.navigation; 行导致错误:

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

这是我的代码:

import React, { Component } from "react";
import { StackNavigator } from "react-navigation";
import { AppRegistry, Text, View } from "react-native";

export default class App extends Component {
  static navigationOptions = {
    title: "Login",
    headerStyle: {
      backgroundColor: "#000000"
    },
    headerTitleStyle: {
      color: "#fff"
    }
  };

  constructor(props) {
    super(props);
  }
  render() {
    console.log(this.props);

    const { navigate } = this.props.navigation;
    return (
      <View>
        <Text>Hello</Text>
      </View>
    );
  }
}

const myscreens = StackNavigator({
  Home: { screen: App }
});
AppRegistry.registerComponent("app", () => myscreens);

我做错了什么,我该如何解决?

我还应该提到,props 在渲染函数和构造函数中是空的。

这是我的 package.json 以防万一

{
  "name": "myapp",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start",
    "test": "jest"
  },
  "dependencies": {
    "react": "16.0.0-alpha.12",
    "react-native": "0.48.3",
    "react-navigation": "git+https://github.com/react-community/react-navigation.git"
  },
  "devDependencies": {
    "babel-jest": "21.0.2",
    "babel-preset-react-native": "4.0.0",
    "jest": "21.1.0",
    "react-test-renderer": "16.0.0-alpha.12"
  },
  "jest": {
    "preset": "react-native"
  }
}

这是我的 index.android.js

import React, { Component } from 'react';
import App from './components/app';
import {
  AppRegistry,
  View
} from 'react-native';

export default class myapp extends Component {
  render() {
    return (
        <App />
    );
  }
}


AppRegistry.registerComponent('myapp', () => myapp);

【问题讨论】:

  • 我刚刚创建了一个全新的项目,只安装了react-navigation 并且没有出现错误。也许发布你的package.json?
  • @MichaelCheng 好的,谢谢我刚刚添加了我的 package.json 和我的 index.android.js。希望这会有所帮助?

标签: javascript react-native react-navigation stack-navigator


【解决方案1】:

两个错误:

  1. 你不应该像那样调用AppRegistry 两次。您可以将其从您的 app.js 文件中删除。

  2. 您误解了react-navigation 的路由器的工作原理。 StackNavigator(以及 Tab 和 Drawer)是需要直接呈现的组件(例如,您传递给 AppRegistry [A] 的内容)或在应用程序中的某个位置 [B]。

因此,要解决此问题,您需要导出 myscreens 而不是 App。为了说明这两种方法:

A.您可以看到in the docs 的一个示例,但是由于您将代码分成两个文件,所以它看起来像这样:

./components/app.js

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

class App extends Component {
  static navigationOptions = {
    title: 'Login',
    headerStyle: {
      backgroundColor: '#000000',
    },
    headerTitleStyle: {
      color: '#fff',
    },
  };

  constructor(props) {
    super(props);
  }
  render() {
    console.log(this.props);

    const { navigate } = this.props.navigation;
    return (
      <View>
        <Text>Hello</Text>
      </View>
    );
  }
}

const myscreens = StackNavigator({
  Home: { screen: App },
});

export default myscreens;

index.android.js

import { AppRegistry } from 'react-native';
import myscreens from './components/app';

AppRegistry.registerComponent('myapp', () => myscreens);

B. 您将在另一个类中渲染StackNavigator,然后导出渲染它的类。这更符合您已经在做的事情,并且从长远来看更灵活(例如:如果您在某些时候使用redux,您将需要这样做),所以您应该这样做:

./components/app.js - 注意myscreens 的大小写更改为MyScreens。这是需要的,因为 React Native 会将 complain about this 设置为 lowercase JSX tags are considered to be HTML。直接使用 AppRegistry 不会触发此错误,因为您没有在 JSX 中使用 myscreens。

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

class App extends Component {
  static navigationOptions = {
    title: 'Login',
    headerStyle: {
      backgroundColor: '#000000',
    },
    headerTitleStyle: {
      color: '#fff',
    },
  };

  constructor(props) {
    super(props);
  }
  render() {
    console.log(this.props);

    const { navigate } = this.props.navigation;
    return (
      <View>
        <Text>Hello</Text>
      </View>
    );
  }
}

const MyScreens = StackNavigator({
  Home: { screen: App },
});

export default MyScreens;

index.android.js

import React, { Component } from 'react';
import { AppRegistry } from 'react-native';
import MyScreens from './components/app';

export default class myapp extends Component {
  render() {
    return <MyScreens />;
  }
}

AppRegistry.registerComponent('myapp', () => myapp);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2020-07-16
    相关资源
    最近更新 更多