首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对父组件函数的导航子组件数据[react导航6]

对父组件函数的导航子组件数据[react导航6]
EN

Stack Overflow用户
提问于 2021-12-10 16:56:54
回答 1查看 846关注 0票数 0

我的感觉是我有多个屏幕(CategoriesScreen,CategoryMealsScreen,MealDetailsScreen,收藏夹屏幕)。我希望将我的膳食项目外包到一个单独的组件中,并在CategoryMealsScreen和收藏夹屏幕中重用该组件。

  1. 组件
    • MealList
    • MealItem

  2. 屏幕
    • CategoriesScreen
    • CategoryMealsScreen
    • MealDetailsScreen
    • 收藏夹屏幕

首先用户在CategoriesScreen中选择一个类别,然后使用代码

代码语言:javascript
运行
复制
props.navigation.navigate('CategoryMeals', 
                     {categoryId: itemData.item.id}  

CategoryMealsScreen接收categoryId

代码语言:javascript
运行
复制
catId = props.route.params.categoryId;

现在,我想从父CategoryMealsScreen.js导航到子组件。密码正确吗?

代码语言:javascript
运行
复制
return <MealList listData={displayedMeals}   navigation = {props.navigation} />;

然后在MealList中导航到MealDetailsScreen

代码语言:javascript
运行
复制
onSelectMeal={() => {
              props.navigation.navigate({
                routeName: 'MealDetail',
                params: {
                  mealId: itemData.item.id
                }
              });

错误:使用对象作为参数调用导航时,需要指定名称或键。请在单击https://reactnavigation.org/docs/navigation-actions#navigate错误后查看CategoryMealsScreen的使用情况,并且无法显示MealDetailsScreen。

代码语言:javascript
运行
复制
    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;

如果你有什么想法,请分享。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-11 08:57:54

例如,您有这样的堆栈屏幕。

代码语言:javascript
运行
复制
 <Stack.Screen name="MealDetailsScreen" component={MealDetailsScreen} />

您应该尝试使用屏幕的名称来导航。喜欢,

代码语言:javascript
运行
复制
onSelectMeal={() =>  
              props.navigation.navigate( 
                'MealDetailsScreen',
            {
                  mealId: itemData.item.id
               
       })}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70307960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档