ReactJS - Datos no son Mostrados en render despues de llamada a servidor

 
Vista:
Imágen de perfil de Marvin
Val: 9
Ha mantenido su posición en ReactJS (en relación al último mes)
Gráfica de ReactJS

Datos no son Mostrados en render despues de llamada a servidor

Publicado por Marvin (26 intervenciones) el 18/09/2019 20:16:22
Hola comunidad, quisiera que me ayuden guiandome con un pequeño problema que tengo con React Native (se que este foro es de React JS pero practicamente es lo mismo que React Native).

Estoy usando Axios para obtener datos del servidor por medio de Get, usando el metodo de ciclo de vida componentWillMount para llenar el array data: [] del estado del componente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
constructor(props) {
    super(props);
    this.state = {
        loading: false,
        data: [],
        url1: "https://miApi.com/mydata.json" //URL Ficticia para este ejemplo
    }
  }
 
//Metodo para obtener los datos desde de una API propia 
//Muestro los datos por consola, y los datos si estan en el array data.
componentWillMount() {
    this.setState({loading: true})
    axios.get(this.state.url1)
    .then(
      (res) => {
        this.setState({
          data: res.data,
          loading: false
        });
        console.log("The data is:\n", this.state.data); //El array de objetos se muestran en la consola
      }
    ).catch(err => {
      console.log('There was an error:', err);
    });
  }

Este es uno de los objetos Json que obtengo desde la API, son 10 objetos pero no hace falta poner los 10:
1
2
3
4
{
  Nombre: "Imagen 1",
  Imagen: "https://static2.bigstockphoto.com/3/8/2/large2/283895071.jpg"
}

Como siguiente paso despues de que se ejecute componentWillMount(), my idea es llenar Dinamicamente un <View> usando un cilco for o la funcion map() de javascript, para agregar imagenes y ciertos datos a un Slider de mi App, pero no obtengo nada, mi slider se queda vacio sin ninguna imagen a pesar de que la variable de estado data si esta llena. Los metodos para llenar dinamicamente mi <View> son los siguientes:

1
2
3
4
5
6
7
8
9
10
11
12
CreateFoodViews = () => {
    foods = [];
    for (var i = 0; i < this.state.data.length; i++) {
        foods.push(
          <View key={i}>
                <Text>{ this.state.data[i].Nombre }</Text>
                <View style={{flex:1}}><Image source={{ uri: this.state.data[i].Imagen }} style={{ width:null, height:null, resizeMode:'cover', flex:1}}/></View>
          </View>
        );
    }
    return foods;
  }

Luego, una vez que se realiza el ciclo for para crear el contenido dinamico se inserta en el metodo render() de la clase del componente:
1
2
3
4
5
6
7
8
9
render() {
  return (
    <View style={{flex:1}}>
     <ViewPagerAndroid style={{flex:1, backgroundColor:'black'}} initialPage={0}>
        { this.CreateFoodViews() }
     </ViewPagerAndroid>
   </View>
  );
};

Pero en el dispositivo simulador no aparece ninguna imagen y obtengo el siguiente error:
TypeError: TypeError: undefined is not an object (evaluating '_this.state.data[i].Imagen')

Alguien que maneje React que me pueda ayudar? creo que puede ser por motivos de ciclo de vida del componente.
Incluso he tratado de simular el objeto data agregando los objetos manualmente para verificar si es algun error de sincronizacion, pero el problema persiste, NO SE MUESTRA NINGUN ERROR en la consola, pero las imagenes siguen sin aparecer, El array data modificado manualmente seria el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
data: [
 {
  Nombre: "Imagen 1",
  Imagen: "https://static2.bigstockphoto.com/3/8/2/large2/283895071.jpg"
},
 
{
  Nombre: "Imagen 2",
  Imagen: "https://static2.bigstockphoto.com/3/8/2/large2/283896762.jpg"
},
 
{
  Nombre: "Imagen 3",
  Imagen: "https://static2.bigstockphoto.com/3/8/2/large2/283834073.jpg"
}
 
.......
]
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip
Val: 10
Ha mantenido su posición en ReactJS (en relación al último mes)
Gráfica de ReactJS

Datos no son Mostrados en render despues de llamada a servidor

Publicado por kip (5 intervenciones) el 18/09/2019 20:49:48
Hola, estas seguro que todos items de la data recibida a partir del request tiene la propiedad Imagen ? Intenta hacer el for sin inyectar la data a ningun componente y haz un chequeo de propiedades, quizas algo asi:

1
2
3
4
5
6
CreateFoodViews = () => {
    foods = []
    for (let item of this.state.data) {
        if (item.hasOwnProperty('Imagen') === false) console.log(item)
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Marvin
Val: 9
Ha mantenido su posición en ReactJS (en relación al último mes)
Gráfica de ReactJS

Datos no son Mostrados en render despues de llamada a servidor

Publicado por Marvin (26 intervenciones) el 18/09/2019 21:11:05
Hola Kip.. efectivamente ya hice la ejecucion del codigo que me diste:

1
2
3
4
5
6
7
CreateFoodViews = () => {
    foods = []
    lookFor = "Imagen"
    for (let item of this.state.data) {
        if (item.hasOwnProperty(lookFor)) console.log("Yes, There is "+ lookFor)
    }
  }

Y si me devuelte que existe en el objeto.. tienes alguna otra idea de que puede ser el problema.. incluso he intentado hacerlo con map() pero no me devuelve nada dentro del View:

1
2
3
4
5
6
7
8
CreateFoodViews = () => {
    return this.state.data.map((item) => {
           <View key={ this.state.data.indexOf(item) }>
                <Text>{ item.Nombre }</Text>
                <View style={{flex:1}}><Image source={{ uri: item.Imagen }} style={{ width:null, height:null, resizeMode:'cover', flex:1}}/></View>
           </View>
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 10
Ha mantenido su posición en ReactJS (en relación al último mes)
Gráfica de ReactJS

Datos no son Mostrados en render despues de llamada a servidor

Publicado por kip (5 intervenciones) el 18/09/2019 21:36:34
No, no, el codigo que te coloque yo es diferente al que colocaste tu, en tu caso el console log si se mostrara y esta bien pero no es lo que queria que evaluaras, queria que la salida sea solo en el caso de que no exista aquella Key o propiedad dentro del objeto, ya que segun el error que tienes es debido posiblemente a eso, un valor undefined dentro de la data que iteras.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Marvin
Val: 9
Ha mantenido su posición en ReactJS (en relación al último mes)
Gráfica de ReactJS

Datos no son Mostrados en render despues de llamada a servidor

Publicado por Marvin (26 intervenciones) el 18/09/2019 22:18:16
Hola.. ya ejecute el codigo exactamente como lo pusiste, no midifique nada.. y efectivamente No se muestra nada en consola.. lo que quiere decir que el item si existe. No crees que tenga algo que ver ya sea con:

1) Ambito de la variables
2) Ciclo de vida de componentes

Ya que puede ser que el metodo createFoodViews() se este tardando en en hacer fetch de la data de la API y el metodo render() se este ejecutanto antes de que los datos sean guardados en la variable data del estado, por lo tanto estaria trabajando con un "data" vacio y por eso se muestra vacio
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Marvin
Val: 9
Ha mantenido su posición en ReactJS (en relación al último mes)
Gráfica de ReactJS

Datos no son Mostrados en render despues de llamada a servidor

Publicado por Marvin (26 intervenciones) el 18/09/2019 22:56:37
Efectivamente ha sido el el ciclo de vida del componente (Aun no le he resuelto).. pero puse console.logs en cada uno de los metodos para monitorear su ciclo, y pues el metodo render() es el primero en crearse y el componentWillMount() es el ultimo, por eso es que render() esta haciendo el ciclo for con un array vacio!
Capture
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 10
Ha mantenido su posición en ReactJS (en relación al último mes)
Gráfica de ReactJS

Datos no son Mostrados en render despues de llamada a servidor

Publicado por kip (5 intervenciones) el 18/09/2019 23:14:14
Es correcto lo que dices, al ser async la ejecucion de axios hay un estado previo que se actualiza con render, el componente siempre se actualizara cuando algun item del estado cambie, pero al hacer en CreateFoodViews una iteracion no pasa nada ya que al final no el valordata del estado del componente es un array vacio, por ende no iteras y no se ejecuta el codigo dentro del map o del for.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Marvin
Val: 9
Ha mantenido su posición en ReactJS (en relación al último mes)
Gráfica de ReactJS

Datos no son Mostrados en render despues de llamada a servidor

Publicado por Marvin (26 intervenciones) el 18/09/2019 23:53:23
Y como podria implementar lo que necesito? de que manera me recomendarias? tengo entendido que el unico metodo que se ejecuta antes de la creacion del compomente es componentWillMount().. como lo harias tu entonces?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 10
Ha mantenido su posición en ReactJS (en relación al último mes)
Gráfica de ReactJS

Datos no son Mostrados en render despues de llamada a servidor

Publicado por kip (5 intervenciones) el 19/09/2019 00:13:24
Me parece que el problema no es por el clico de vida del componente, mas bien por el contenido o estrucutra de la data rcibida de la peticion, date cuenta que el error es claro TypeError: TypeError: undefined is not an object (evaluating '_this.state.data[i].Imagen'), el valor de data en ese indice no es un objeto en su lugar es undefined porque accedes a un indice que no existe, por ejemplo:

1
2
const myArray = [1,2,3]
console.log(typeof myArray[26] === "undefined") // true

Lo de arriba es en el contexto del for, ahora bien no se porque no te funciona con el .map() ya que iteras sobre los items existentes, que error te lanza aquella implementacion ? Intenta con for(let item of this.state).

Por cierto, con map() tienes acceso al indice, no es necesario que haga el indexOf:

1
2
3
4
5
6
7
8
CreateFoodViews = () => {
    return this.state.data.map((item, index) => {
           <View key={ index }>
                <Text>{ item.Nombre }</Text>
                <View style={{flex:1}}><Image source={{ uri: item.Imagen }} style={{ width:null, height:null, resizeMode:'cover', flex:1}}/></View>
           </View>
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar