undefined 不是对象(评估 this.props.navigation.navigate)
我第一次尝试学习 React Native。我尝试引入一个 stacknavigator,但行
const {navigate} = this.props.navigation;
导致错误:
undefined is not an object (evaluating '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);
我做错了什么,如何修复?
我还应该提到,在 render 函数和构造函数中 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);
两个错误:
-
您不应该像这样两次调用
AppRegistry
。您可以将其从app.js
文件中移除。 -
您误解了
react-navigation
路由器的工作原理。StackNavigator
(以及 Tab 和 Drawer)是需要直接渲染的组件(例如,您传递给AppRegistry
[A])或在应用程序的某个时刻渲染 [B]。
因此,要解决此问题,您需要导出
myscreens
而不是
App
。为了说明这两种方法的实现方式:
A. 您可以在 文档 中看到此示例,但由于您将代码分成两个文件,因此它看起来会是这样的:
./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 将
抱怨此问题
,因为
小写 JSX 标签被视为 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);