Abdul Wahab
Abdul Wahab

Reputation: 185

How to display fetched data in react native

I successfully posted data in MongoDB Atlas, Now i want to display that data in my simple react native App. Data is showing in my terminal but i am not able to display data in my App.

Here is code for Get data form the db.

display(){
  fetch('myUrl', {
  method: 'GET'
})
 .then((response) => response.json())
 .then((responseJson) => {
   console.log(responseJson);
   this.setState({
     title: responseJson,
     description: responseJson
   })
 })
 .catch((error) => {
   console.error(error);
 });
}

Here is the code that is not displaying the data in App

<TouchableOpacity onPress={()=>this.display()} style={styles.btn}>
  <Text style={{textAlign: 'center'}}> Display </Text>
</TouchableOpacity>

<View>
  <FlatList
    data={this.state.title}
    renderItem={({item}) => <Text>{item.title}</Text>}
    keyExtractor={({id}, index) => id}
    />
</View> 

Upvotes: 1

Views: 448

Answers (3)

SuleymanSah
SuleymanSah

Reputation: 17858

Flatlist data property expects an array.

But you seem to set an object.

If your api returns an array you can make the following changes to make it work:

state = {
   items:[]
}

display() {
  fetch('myUrl', { method: 'GET'})
 .then((response) => response.json())
 .then((responseJson) => {
   console.log(responseJson);
   this.setState({
        items: responseJson
   })
 })
 .catch((error) => {
   console.error(error);
 });
}

As you see I used items in state as array, and updated its value when I got response from api.

And in flatlist:

<View>
  <FlatList
    data={this.state.items}
    renderItem={({item}) => <Text key={item._id}>{item.title}</Text>}
    keyExtractor={ item => item._id}
    />
</View> 

A sample codesandbox

Upvotes: 1

Ravi Sharma
Ravi Sharma

Reputation: 527

Update your code like this:

this.state = {
  responseData:[]
}
display = () => {
  fetch('myUrl', {
  method: 'GET'
})
 .then((response) => response.json())
 .then((responseJson) => {
   console.log(responseJson);
   this.setState({
     responseData: responseJson,
   })
 })
 .catch((error) => {
   console.error(error);
 });
}

inside your render function:

render(){
  const { responseData } = this.state;
  return(
    <TouchableOpacity onPress={()=>this.display} style={styles.btn}>
      <Text style={{textAlign: 'center'}}> Display </Text>
    </TouchableOpacity>

    <View>
      <FlatList
        data={responseData}
        renderItem={this.renderItem}
        keyExtractor={item => item.id}
        />
    </View> 
  );
}
renderItem = ({item}) => {
  const { title, id, description, date } = item;

  <View key={item.id}>
    <Text>{item.id}</Text>
    <Text>{item.title}</Text>
    <Text>{item.description}</Text>
    <Text>{item.date}</Text>
  </View>
}

Upvotes: 1

harkesh kumar
harkesh kumar

Reputation: 883

try with return keywork
Working demo api

display(){

     return fetch('myUrl', {
      method: 'GET'
    })
     .then((response) => response.json())
     .then((responseJson) => {
       console.log(responseJson);
       this.setState({
         title: responseJson,
         description: responseJson
       })
     })
     .catch((error) => {
       console.error(error);
     });
    }

Upvotes: 0

Related Questions