我的感觉是我有多个屏幕(CategoriesScreen,CategoryMealsScreen,MealDetailsScreen,收藏夹屏幕)。我希望将我的膳食项目外包到一个单独的组件中,并在CategoryMealsScreen和收藏夹屏幕中重用该组件。
首先用户在CategoriesScreen中选择一个类别,然后使用代码
props.navigation.navigate('CategoryMeals',
{categoryId: itemData.item.id}
CategoryMealsScreen接收categoryId
catId = props.route.params.categoryId;
现在,我想从父CategoryMealsScreen.js导航到子组件。密码正确吗?
return <MealList listData={displayedMeals} navigation = {props.navigation} />;
然后在MealList中导航到MealDetailsScreen
onSelectMeal={() => {
props.navigation.navigate({
routeName: 'MealDetail',
params: {
mealId: itemData.item.id
}
});
错误:使用对象作为参数调用导航时,需要指定名称或键。请在单击https://reactnavigation.org/docs/navigation-actions#navigate错误后查看CategoryMealsScreen的使用情况,并且无法显示MealDetailsScreen。
import React from 'react';
import { View, Text, FlatList, StyleSheet, TouchableOpacity } from 'react-native';
import { CATEGORIES } from '../data/dummy-data';
import Colors from '../constants/Colors';
import CategoryGridTile from '../components/CategoryGridTile'
const CategoriesScreen = props =>
{
const renderGridItem = itemData => {
return (
<CategoryGridTile
title={itemData.item.title}
color={itemData.item.color}
onSelect = {() => {
props.navigation.navigate('CategoryMeals',
{categoryId: itemData.item.id}
);
}}
/>
);
};
return (
<FlatList
keyExtractor={(item, index) => item.id}
data={CATEGORIES}
renderItem={renderGridItem}
numColumns={2}
/>
);
};
....
export default CategoriesScreen;
************************************
import React from 'react';
import {View, Text, Button, FlatList} from 'react-native';
import {CATEGORIES , MEALS} from '../data/dummy-data';
import MealList from '../components/MealList';
const CategoryMealsScreen = props =>{
const catId = props.route.params.categoryId;
const displayedMeals = MEALS.filter(meals => meals.categoryIds.indexOf(catId) >= 0 );
//I think the error is for this line
return <MealList listData={displayedMeals} navigation = {props.navigation} />;
};
CategoryMealsScreen.navigationOptions = navigationData => {
const catId = navigationData.navigation.getParam('categoryId');
const selectedCategory = CATEGORIES.find(cat => cat.id === catId);
return {
headerTitle: selectedCategory.title,
};
};
export default CategoryMealsScreen
***********************************
import React from 'react';
import { View, FlatList, StyleSheet } from 'react-native';
import MealItem from './MealItem';
const MealList = props => {
const renderMealItem = itemData => {
return (
<MealItem
title={itemData.item.title}
image={itemData.item.imageUrl}
duration={itemData.item.duration}
complexity={itemData.item.complexity}
affordability={itemData.item.affordability}
onSelectMeal={() => {
props.navigation.navigate({
routeName: 'MealDetail',
params: {
mealId: itemData.item.id
}
});
}}
/>
);
};
return (
<View style={styles.list}>
<FlatList
data={props.listData}
keyExtractor={(item, index) => item.id}
renderItem={renderMealItem}
style={{ width: '100%' }}
/>
</View>
);
};
const styles = StyleSheet.create({
list: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
padding: 15
}
});
export default MealList;
-------------------------------------------------
import React from 'react';
import { View, Text, Button, StyleSheet } from 'react-native';
import { HeaderButtons, Item } from 'react-navigation-header-buttons';
import { MEALS } from '../data/dummy-data';
import HeaderButton from '../components/HeaderButton';
const MealDetailScreen = props => {
const mealId = props.route.params.mealId;
const selectedMeal = MEALS.find(meal => meal.id === mealId);
return (
<View style={styles.screen}>
<Text>{selectedMeal.title}</Text>
<Button
title="Go Back to Categories"
onPress={() => {
props.navigation.popToTop();
}}
/>
</View>
);
};
MealDetailScreen.navigationOptions = navigationData => {
const mealId = navigationData.navigation.getParam('mealId');
const selectedMeal = MEALS.find(meal => meal.id === mealId);
return {
headerTitle: selectedMeal.title,
headerRight: (
<HeaderButtons HeaderButtonComponent={HeaderButton}>
<Item
title="Favorite"
iconName="ios-star"
onPress={() => {
console.log('Mark as favorite!');
}}
/>
</HeaderButtons>
)
};
};
const styles = StyleSheet.create({
screen: {
flex: 1,
justifyContent: 'center',
alignItems: 'center'
}
});
export default MealDetailScreen;
如果你有什么想法,请分享。
发布于 2021-12-11 08:57:54
例如,您有这样的堆栈屏幕。
<Stack.Screen name="MealDetailsScreen" component={MealDetailsScreen} />
您应该尝试使用屏幕的名称来导航。喜欢,
onSelectMeal={() =>
props.navigation.navigate(
'MealDetailsScreen',
{
mealId: itemData.item.id
})}
https://stackoverflow.com/questions/70307960
复制相似问题