【发布时间】:2022-01-06 11:47:14
【问题描述】:
如何正确键入作为道具传递给另一个组件的导航?根据文档
应用中的每个屏幕组件都会自动提供导航道具。
还有,
要对我们的屏幕进行类型检查,我们需要对屏幕接收到的导航道具和路线道具进行注释。
type Props = NativeStackScreenProps<RootStackParamList, 'Profile'>;
我有一个带路由器的导航组件:
const App: React.FC = () => {
const [userMetrics, setUserMetrics] = useState<UserMetrics>(null);
const Stack = createNativeStackNavigator<RootStackParamList>();
return (
<UserMetricsContext.Provider value={{ userMetrics, setUserMetrics }}>
<NavigationContainer>
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={Home} />
<Stack.Screen name="Tests" component={Tests} />
</Stack.Navigator>
</NavigationContainer>
</UserMetricsContext.Provider>
);
};
在主屏幕中,我想接收导航道具以将其进一步传递到表单,该表单有一个按钮,该按钮将导航到测试组件并将表单数据作为参数传递:
interface Props {
navigation: NativeStackScreenProps<RootStackParamList, "Home">;
}
export const Home: React.FC<Props> = ({ navigation }) => {
const { setUserMetrics } =
useContext<IUserMetricsContextType>(UserMetricsContext);
return (
<View style={styles.container}>
<StatusBar style="auto" />
<HealthCheckForm onSubmit={setUserMetrics} navigation={navigation} />
</View>
);
};
现在问题开始在表单组件中可见,因为打字稿假设一个级别太多,我已经像在父 Home 组件中那样输入了道具:
interface Props {
onSubmit: React.Dispatch<React.SetStateAction<UserMetrics>>;
navigation: NativeStackScreenProps<RootStackParamList, "Home">;
}
打字稿希望我像这样使用它:
const submitHandler = (data: UserMetrics) => {
onSubmit(data);
navigation.navigation.navigate("Tests", { userMetrics: data });
console.log(data);
};
但是,这不起作用,正确的 - 工作和导航用法是
navigation.navigate("Tests", { userMetrics: data });
当我导航到 Tests 组件并传递参数时,我不知道如何在 Test 组件中接收它们。我试图像这样类比地这样做:
interface Props {
navigation: NativeStackScreenProps<RootStackParamList, "Tests">;
}
export const Tests: React.FC<Props> = ({ navigation }) => {
const { userMetrics } =
useContext<IUserMetricsContextType>(UserMetricsContext);
console.log({ params: navigation.route.params });
return (
<View>
<DisplayList />
</View>
);
};
我收到另一个关于读取未定义属性的错误。 谢谢
【问题讨论】:
标签: javascript reactjs typescript react-native react-navigation