es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Expo: ¿Cómo puedo obtener datos de la API de Django Rest Framework?

Estoy usando Expo 5.0.1.
Tengo una API que funciona bien.

Aquí está todo mi App.js:

“`
import React, { useState, useEffect } from ‘react’;
import { StyleSheet, Text, View, FlatList } from ‘react-native’;

const [data, setData] = useState([{title: “Primer título”}]);

useEffect(() => {
fetch(‘http://192.168.1.68:89/cards/’, {
method: “GET”
})
.then(resp => resp.json())
.then(data => {
console.log(data)
})
.catch(error => console.log(“Error es : “, error))
}, [])

const renderData = (item) => {
return(

{item.user}
{item.is_suspended}
{item.id}

)
}

export default function App() {

return (

{
return renderData(item)
}}
keyExtractor={item => item.user}
/>

);
}

const styles = StyleSheet.create({
Bold: {fontWeight: ‘600’},
Red: {color: ‘red’},
px30: {fontSize: ’20px’},
view: {justifyContent: ‘center’, textAlign: ‘center’, paddingTop: ’20px’},
})
No puedo obtener ni siquiera el error de mi ‘.catch’. Aquí está el error:
Error1

Y aquí es cuando pongo el código de useEffect en la función app:
Error2

¿Alguien puede ayudarme a obtener datos de una API REST?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que hay dos errores ocurriendo aquí. El primer error (Error1) no está siendo capturado en el bloque .catch de la solicitud fetch, por lo tanto el mensaje de error no se está mostrando. Para solucionar esto, puedes agregar una instrucción console.error dentro del bloque catch para guardar el mensaje de error en la consola:

    .catch(error => console.error("El error es: ", error))
    

    El segundo error (Error2) se debe a que la solicitud fetch está siendo llamada fuera del componente App, pero depende de los hooks useState y useEffect que solo pueden ser utilizados dentro de componentes funcionales. Para solucionar esto, puedes mover la solicitud fetch dentro del componente App y eliminar el hook useEffect que actualmente se encuentra arriba de él:

    export default function App() {
      const [data, setData] = useState([{ title: "Primer título" }]);
    
      const fetchCards = () => {
        fetch("http://192.168.1.68:89/cards/", {
          method: "GET"
        })
          .then(resp => resp.json())
          .then(data => {
            console.log(data);
            setData(data); // establecer los datos de la respuesta en el estado
          })
          .catch(error => console.error("El error es: ", error));
      };
    
      useEffect(() => {
        fetchCards();
      }, []);
    
      const renderData = item => {
        return (
          <view style="{styles.view}">
            <text>{item.user}</text>
            <text>{item.is_suspended}</text>
            <text>{item.id}</text>
          </view>
        );
      };
    
      return (
        <view style="{styles.view}">
          <flatlist data="{data}" renderitem="{({" item="" })=""> {
              return renderData(item);
            }}
            keyExtractor={item => item.user}
          />
        </flatlist></view>
      );
    }
    

    Al mover la solicitud fetch dentro del componente App y llamarla dentro del hook useEffect, nos aseguramos de que solo se llame una vez cuando el componente se monta inicialmente. Luego, establecemos los datos de respuesta en la variable de estado data usando la función setData, lo cual nos permite renderizarlos usando el componente FlatList.

Comments are closed.