我正在尝试在屏幕之间传递数据 并失败了
undefined is not an object (evaluating 'props.navigation.getParams')
我的代码:
第一个屏幕:
const ForgotPasswordScreen = ({ navigation, }) => {
const [text, setText] = useState('');
return (
<View>
<TextInput onChangeText={(text) => { setText(text) }}></TextInput>
<TouchableOpacity onPress={() => { navigation.navigate('VerificationScreen', { phoneNumber: text }) }}>
<Text style={{ color: COLORS.WHITE, fontSize: 16, fontWeight: 'bold' }}>Continue</Text>
</TouchableOpacity>
</View>
)
我正在尝试在第二个屏幕上接收数据:
const VerificationScreen = ({ navigation, }, props) => {
const phoneNumber = props.navigation.getParams('phoneNumber');
return (
<View>
<Text>{phoneNumber}</Text>
</View>
)
非常感谢!
答案 0 :(得分:2)
在React中,props
是功能组件的 first 参数。
在上面的示例中,您尝试在props
函数组件(将为VerificationScreen
)的 second 参数中访问undefined
。
此外,您尝试访问props.navigation
,这会给您一个错误:
未捕获的TypeError:无法读取未定义的属性“导航”
相反,因为您已经在navigation
函数组件的 first 参数中从props
解构VerificationScreen
,所以应该使用它来访问navigate
方法。
const ForgotPasswordScreen = ({ navigation }) => {
const [text, setText] = useState('');
return (
<View>
<TextInput onChangeText={(text) => { setText(text) }}></TextInput>
<TouchableOpacity onPress={() => { navigation.navigate('VerificationScreen', { phoneNumber: text }) }}>
<Text>Continue</Text>
</TouchableOpacity>
</View>
)
const VerificationScreen = ({ navigation }) => {
const phoneNumber = navigation.getParams('phoneNumber');
return (
<View>
<Text>{phoneNumber}</Text>
</View>
)
}
我强烈建议您花一些时间阅读the react docs。
答案 1 :(得分:0)
输出:
这个完整的示例应该起作用:
import React, { useState } from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import {
Text,
View,
StyleSheet,
TextInput,
TouchableOpacity,
} from 'react-native';
import Constants from 'expo-constants';
// You can import from local files
import AssetExample from './components/AssetExample';
// or any pure javascript modules available in npm
import { Card } from 'react-native-paper';
const Stack = createStackNavigator();
const App = ({ navigation }) => {
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="ForgotPassword" component={ForgotPasswordScreen} />
<Stack.Screen name="Verification" component={VerificationScreen} />
</Stack.Navigator>
</NavigationContainer>
);
};
const VerificationScreen = ({ navigation, route }) => {
const { phoneNumber } = route.params;
return (
<View>
<Text>{phoneNumber}</Text>
</View>
);
};
const ForgotPasswordScreen = ({ navigation }) => {
const [text, setText] = useState('');
const handleInput = (event) => {
let temp = event.nativeEvent.text;
setText(temp);
console.log(temp)
};
return (
<View style={styles.container}>
<TextInput
placeholder={'Input Text'}
value={text}
onChange={handleInput}
style={styles.input}
/>
<TouchableOpacity
onPress={() =>
text
? navigation.navigate('Verification', { phoneNumber: text })
: alert('Please Input the text')
}>
<View style={styles.btn}>
<Text style={styles.text}>NEXT</Text>
</View>
<Text>{text}</Text>
</TouchableOpacity>
</View>
);
};
export default App;
const styles = StyleSheet.create({
container: {
marginTop: 100,
},
btn: {
width: 100,
height: 50,
backgroundColor: 'white',
borderRadius: 10,
border: '2px solid black',
justifyContent: 'center',
alignItems: 'center',
},
input: {
borderRadius: 10,
color: 'black',
width: 300,
padding: 10,
border: '2px solid green',
marginVertical: 5,
},
text: {
fontWeight: 'bold',
},
});
您可以在此处找到完整的实时示例:Live Demo