Home > Net >  Objects are not valid as a React child React Native
Objects are not valid as a React child React Native

Time:02-09

I'm getting Render Error Objects are not valid as a React child (found:object with keys {name, lati, long}). If you meant to render a collection of children, use an array instead.

I need to send the prop "name" from const mesta using Tab.Screen children, but keep getting the error.

My code:

MainContainer.js

import * as React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import Ionicons from 'react-native-vector-icons/Ionicons';

// Screens
import Primary from './Screens/Primary';
import Secondary from './Screens/Secondary';
import Map_map from './Screens/Map_map';

// Locations
const mesta = [
  {name: 'Praha', lati: '', long: ''},
  {name: 'České Budějovice', lati: '', long: ''},
  {name: 'Plzeň', lati: '', long: ''},
  {name: 'Karlovy Vary', lati: '', long: ''},
  {name: 'Ústí nad Labem', lati: '', long: ''},
  {name: 'Liberec', lati: '', long: ''},
  {name: 'Hradec Králové', lati: '', long: ''},
  {name: 'Pardubice', lati: '', long: ''},
  {name: 'Jihlava', lati: '', long: ''},
  {name: 'Brno', lati: '', long: ''},
  {name: 'Olomouc', lati: '', long: ''},
  {name: 'Ostrava', lati: '', long: ''},
  {name: 'Zlín', lati: '', long: ''},
]

//Screen names
const lokace = "Lokace";
const mapa = "Mapa";
const mapa_det = "Mapa_det";

const Tab = createBottomTabNavigator();

function MainContainer() {
  return (
    <NavigationContainer>
      <Tab.Navigator
        initialRouteName={lokace}
        screenOptions={({ route }) => ({
          tabBarIcon: ({ focused, color, size }) => {
            let iconName;
            let rn = route.name;

            if (rn === lokace) {
              iconName = focused ? 'home' : 'home-outline';

            } else if (rn === mapa) {
              iconName = focused ? 'map' : 'map-outline';
            }
            // You can return any component that you like here!
            return <Ionicons name={iconName} size={size} color={color} />;
          },
        })}
        tabBarOptions={{
          activeTintColor: '#007aff',
          inactiveTintColor: 'grey',
          labelStyle: { paddingBottom: 10, fontSize: 10 },
          style: { padding: 10, height: 70}
        }}>

        <Tab.Screen name={lokace} children={() => <Primary mesta={mesta}/>}/>
        {/* <Tab.Screen name={mapa} children={() => <Secondary towns={mesta}/>}/>
        <Tab.Screen name={mapa_det} component={Map_map}/> */}

      </Tab.Navigator>
    </NavigationContainer>
  );
}

export default MainContainer;

Primary.js

import * as React from 'react';
import { StyleSheet, ScrollView, View, Text, Image } from 'react-native';

var nazvy = ['Praha','České Budějovice','Plzeň','Karlovy Vary','Ústí nad Labem','Liberec','Hradec Králové','Pardubice','Jihlava','Brno','Olomouc','Ostrava','Zlín',]


export default function Primary(props)
{
    return(
        <ScrollView style=
            {{ 
                flex: 1,
            }}>
            <View>
                {props.mesta.map(itemz => (
                    <Text 
                    style={styles.card2} 
                    //onPress={() => navigation.navigate('Mapa')}
                    >
                        {itemz}
                    </Text>
                ))}
                    {nazvy.map(item => (
                        <Text 
                        style={styles.card} 
                        //onPress={() => navigation.navigate('Mapa')}
                        >
                            {item}
                        </Text>
                    ))}
            </View>
            </ScrollView>
    );
}

const styles = StyleSheet.create({
    card:{
        backgroundColor: "#007aff",
        borderRadius: 50,
        alignItems: 'center',
        margin: 5,
        padding: 10,
        color: 'white',
        fontWeight: 'bold'
    },
    card2:{
        backgroundColor: "#FF3300",
        borderRadius: 50,
        alignItems: 'center',
        margin: 5,
        padding: 10,
        color: 'white',
        fontWeight: 'bold'
    },
  });

CodePudding user response:

You're rendering an object inside TextView. Refactor your code as below:

import * as React from "react";
import { StyleSheet, ScrollView, View, Text, Image } from "react-native";

var nazvy = [
  "Praha",
  "České Budějovice",
  "Plzeň",
  "Karlovy Vary",
  "Ústí nad Labem",
  "Liberec",
  "Hradec Králové",
  "Pardubice",
  "Jihlava",
  "Brno",
  "Olomouc",
  "Ostrava",
  "Zlín",
];

export default function Primary(props) {
  return (
    <ScrollView
      style={{
        flex: 1,
      }}
    >
      <View>
        {props.mesta.map((itemz) => (
          <>
            <Text
              style={styles.card2}
              //onPress={() => navigation.navigate('Mapa')}
            >
              {itemz.name}
            </Text>

            <Text
              style={styles.card2}
              //onPress={() => navigation.navigate('Mapa')}
            >
              {itemz.lati}
            </Text>

            <Text
              style={styles.card2}
              //onPress={() => navigation.navigate('Mapa')}
            >
              {itemz.long}
            </Text>
          </>
        ))}
        {nazvy.map((item) => (
          <Text
            style={styles.card}
            //onPress={() => navigation.navigate('Mapa')}
          >
            {item}
          </Text>
        ))}
      </View>
    </ScrollView>
  );
}



CodePudding user response:

You can show complete object as string in Text view like

<View>
  {props.mesta.map((itemz) => (
    <Text
      style={styles.card2}
      //onPress={() => navigation.navigate('Mapa')}
    >
      {JSON.stringify(itemz)} // here it is
    </Text>
  ))}
</View>

CodePudding user response:

You are mapping on ‘itemz’ that is a object {name: ´´, lati: ´´, long: ´´ }. If you only need to display the name => itemz.name

Thanks @J.dev for your answer!

  •  Tags:  
  • Related