【问题标题】:Passing objects between react native tab navigator's screens在反应本机选项卡导航器的屏幕之间传递对象
【发布时间】:2018-12-04 20:15:09
【问题描述】:

我有一个底部标签栏导航器,并有 3 个屏幕。在菜单屏幕中,我试图选择一个菜单项,然后在选项卡导航器的第二条路线的购物车屏幕中显示所选的菜单项。 这是我的标签导航器

const MenuNavigator = createBottomTabNavigator(
  {
    Menu:MenuScreen,
    Cart:CartScreen,
    Options:OptionScreen
  },
  {
    defaultNavigationOptions: ({ navigation }) => ({
      tabBarIcon: ({ focused, horizontal, tintColor }) => {
        const { routeName } = navigation.state;
        let iconName;
        if (routeName === 'Menu') {
          iconName = `ios-md-book${focused ? '' : '-outline'}`;
        } else if (routeName === 'Cart') {
          iconName = `ios-options${focused ? '' : '-outline'}`;
        }else if(routeName ==='Options'){
          iconName=`ios-options${focused? '' : '-outline'}`;
        }

        // You can return any component that you like here! We usually use an
        // icon component from react-native-vector-icons
        return <Ionicons name={iconName} size={horizontal ? 20 : 25} color={tintColor} />;
    },
    }),tabBarOptions: {
      activeTintColor: 'tomato',
      inactiveTintColor: 'gray',
    },
  }

  );

我在按钮的 onPress 函数中有一个菜单项对象,如下所示:

var menuitem={itemId:item.itemId,
                    name:item.name,
                    ingredients:item.ingredients,
                    price:item.price,
                    type:item.type};

并在同一个 onPress 函数中将其分配给 MenuScreen 的 menuItem 对象。

this.setState({menuItem:Object.assign({},menuitem)});

并成功地在属于 Menu-screen 的模式中渲染它,但我也想在 Cart-screen 中渲染它。

但是我将如何从购物车屏幕到达该对象? 项目代码和画面太多,我只复制了相关部分。

【问题讨论】:

    标签: javascript reactjs react-native react-native-navigation react-native-tabnavigator


    【解决方案1】:

    您可以使用 Redux 在用于共享数据的所有屏幕上提供总体存储。如果您正在跨屏幕导航,您还可以使用

    传递数据
    this.props.navigation.navigate("NewScreen", {data: dataToBePassed})
    

    然后您可以使用

    检索数据
    this.props.navigation.getParam("data", defaultValue)
    

    您可以了解更多here

    【讨论】:

    • 是的,我忘记提到了,我阅读了 react-navigation 和 react-native 官方教程,它们都不起作用。我不想使用 redux,因为我有 2 天的时间来完成这项任务,我没有足够的时间来学习。我试图使用 this.props.navigation.setParams 和 getParam ,它导致参数在 CartScreen 中变得“无法识别”。在 bottomTabBarNavigation 中,我不使用它自己处理的导航功能,那么它在哪里调用 navigate() 来更改路线?然后我可以像你的例子一样修改它的默认行为?
    • 您是否尝试过使用 setParams 修改该路由状态下的参数,然后从那里访问数据?您可以在此处的“状态”下参考:reactnavigation.org/docs/en/navigation-prop.html
    • 是的,我正在尝试,这就是我所做的:MenuScreen>TouchableOpacity>onPress: this.props.navigation.setParams({mycart:this.state.menuItem});然后我尝试从 CartScreen 获取参数:this.props.navigation.getParam('mycart');然后我将其记录到控制台,它给了我身份不明的对象。我做错了吗?正确的方法是什么?
    • 没关系,设置参数只允许状态访问当前屏幕的当前参数。我认为唯一优雅的解决方案是使用 Redux。我可以想到你在一个单独的 js 文件中创建一个变量并将其导入到两个屏幕,然后更改该变量以共享数据的地方,但我不知道它的效果如何。
    • 感谢有兴趣的朋友,我用这个函数解决了,我发现正确的方法是这样的:onPress={() => { this.setModal(false); this.props.navigation.dispatch(NavigationActions.setParams({ params: { mycart: this.state.menuItem }, key: "Cart", }));然后我使用 getParam 从其他屏幕拉出该对象。我想这可能对像我这样的其他初学者有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2021-11-19
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多