1. Code
  2. JavaScript
  3. React

Obteniendo datos en tu aplicación React

React es posiblemente la biblioteca más popular para crear aplicaciones web interactivas. Sin embargo, React no es un framework web completo. Se centra en la parte de la vista del venerable modelo MVC.
Scroll to top

Spanish (Español) translation by steven (you can also view the original English article)

React es posiblemente la biblioteca más popular para crear aplicaciones web interactivas. Sin embargo, React no es un framework web completo. Se centra en la parte de la vista del venerable modelo MVC.

Existe todo un ecosistema de React que aborda otros aspectos. En este tutorial, aprenderás sobre uno de los elementos más básicos de cualquier aplicación web: cómo obtener datos para mostrar. Esto no es trivial. Hay varios lugares en la jerarquía de componentes de React donde puedes obtener datos. Cuándo buscar datos es otra preocupación. También debes considerar qué tecnología utilizar para obtener tus datos y dónde almacenarlos.

Al final de este tutorial, tendrás una idea clara de cómo funciona la búsqueda de datos en React, los pros y los contras de los diferentes enfoques y cómo aplicar este conocimiento a tus aplicaciones React.

Empezando

Creemos un esqueleto para nuestra aplicación React con create-react-app:

> create-react-app react-data-fetcher

El resultado es una estructura de directorios bastante elaborada. Lee el excelente archivo README si no estás familiarizado con create-react-app.

Crear un servidor simple

Creé un servidor simple para almacenar y entregar notas de autor. No es el enfoque de este tutorial, y su función es proporcionar una API remota para demostrar cómo obtener datos con React. Solo para satisfacer tu curiosidad, es una aplicación de Python 3 basada en el framework hug y usa Redis como almacenamiento persistente.

La API es extremadamente simple. Hay un único punto final, /quotes. Devuelve todas las notas de autor almacenadas en respuesta a una solicitud HTTP GET, y puedes agregar nuevas notas de autor enviando una solicitud HTTP POST.

El código fuente completo está disponible en GitHub.

Descripción general de la aplicación de demostración

La aplicación de demostración es una aplicación React que se comunica con el servicio de notas de autor, muestra todas las notas de autor y te permite agregar nuevas notas.

Aquí hay una captura de pantalla:

A screenshot of the demo applicationA screenshot of the demo applicationA screenshot of the demo application

La estructura de la aplicación es muy sencilla. Comencé con un esqueleto creado por create-react-app y agregué dos componentes en el subdirectorio src: QuoteList y AddQuoteForm. Aquí está la estructura del directorio (excluyendo node_modules):

1
~/git/react-data-fetcher > tree -I node_modules -L 2
2
.
3
├── README.md
4
├── README2.md
5
├── package.json
6
├── public
7
│   ├── favicon.ico
8
│   ├── index.html
9
│   └── manifest.json
10
├── src
11
│   ├── AddQuoteForm.css
12
│   ├── AddQuoteForm.js
13
│   ├── App.css
14
│   ├── App.js
15
│   ├── App.test.js
16
│   ├── QuoteList.js
17
│   ├── index.css
18
│   ├── index.js
19
│   └── registerServiceWorker.js
20
└── yarn.lock
21
22
2 directories, 16 files

El código fuente completo está disponible en GitLab.

Visualización de las notas de autor

El componente funcional QuoteList muestra una lista de citas como una lista de viñetas. Espera una matriz de cadenas:

1
import React from 'react'
2
3
const QuoteList = ({quotes}) =>
4
  quotes.map(quote => <li key={quote}>{quote}</li>)

5
6
7
export default QuoteList

Es un componente secundario del componente principal de la aplicación.

Obtener datos con la API Fetch

La API de recuperación es una API basada en promesas que devuelve un objeto de respuesta. Para llegar al contenido JSON real, debes invocar el método json() del objeto de respuesta.

1
  fetchQuotes = () => {
2
    this.setState({...this.state, isFetching: true})
3
    fetch(QUOTE_SERVICE_URL)
4
      .then(response => response.json())
5
      .then(result => this.setState({quotes: result, 
6
                                     isFetching: false}))
7
      .catch(e => console.log(e));
8
  }
9
}

Colocación de tu código para obtener datos

React se trata, por supuesto, de componentes. La cuestión de dónde colocar el código de obtención de datos es importante. Si factorizas bien tu código, tendrás muchos componentes genéricos y algunos componentes específicos de la aplicación. React y JavaScript en general son muy flexibles, por lo que es posible inyectar lógica en cualquier lugar.

Obtener notas desde una API REST requiere algún tipo de sondeo, ya que quiero que las notas de autor estén siempre actualizadas. Pero la obtención inicial también es importante. Los componentes de React tienen métodos de ciclo de vida en los que puedes implementar lógica que se ejecutará en un momento determinado. El método componentDidMount() se activa cuando se puede acceder al componente y modificar su estado. Es el lugar perfecto para iniciar la búsqueda de datos.

Así es como se ve:

1
  componentDidMount() {
2
    this.fetchQuotes()
3
  }

Si realmente deseas reducir el tiempo para la primera vista, puedes considerar usar el componenteWillMount() para iniciar tu búsqueda asíncrona, pero corres el riesgo de que la búsqueda se complete antes de que se monte el componente. No recomiendo este enfoque.

Consulta Dominar los métodos del ciclo de vida de React para obtener más detalles.

Selecciona la frecuencia con la que se obtienen los datos

La obtención inicial en componentDidMount() es excelente, pero quiero actualizar las notas de autor con frecuencia. En una API basada en REST, la única solución es sondear periódicamente el servidor. El servicio de cotizaciones es muy básico y siempre devuelve todas las cotizaciones.

Los servicios más escalables proporcionarán una forma de buscar actualizaciones o incluso usar HTTP if-modified-since o eTag. Nuestra aplicación de demostración solo obtiene todo cada cinco segundos iniciando un temporizador en componentDidMount() y limpiando en componentWillUnmount():

1
  componentDidMount() {
2
    this.fetchQuotes()
3
    this.timer = setInterval(() => this.fetchQuotes(), 5000);
4
  }
5
  
6
  componentWillUnmount() {
7
    this.timer = null;
8
  }  

La duración del sondeo es una decisión específica de la aplicación. Si necesitas actualizaciones en tiempo real y/o el sondeo está estresando demasiado el back-end, considera usar WebSockets en lugar de REST.

Manejo de la obtención de datos de larga duración

A veces, obtener los datos puede llevar mucho tiempo. En ese caso, mostrar una barra de progreso o una animación brillante para que el usuario sepa lo que está sucediendo puede contribuir mucho a la experiencia del usuario. Esto es especialmente importante cuando el usuario inicia la búsqueda de datos (por ejemplo, haciendo clic en un botón de búsqueda).

En la aplicación de demostración, simplemente muestro un mensaje que dice "Obteniendo notas de autor..." mientras se realiza una búsqueda. En el método render() del componente principal de la aplicación, utilizo la representación condicional comprobando el miembro state.isFetching.

1
  render() {
2
    const title = 'Quotes for ya!'
3
    let now = new Date()
4
5
    return (
6
      <div className='App'>
7
        <h2 className='App-title'>{title}</h2>

8
        <p>{this.state.isFetching ? 'Fetching quotes...' : ''}</p>

9
        <QuoteList quotes={this.state.quotes} />

10
        <AddQuoteForm quote_service_url={QUOTE_SERVICE_URL}/>

11
      </div>

12
    );
13
  }

El método fetchQuotes() se encarga de actualizar state.isFetching inicializándolo en verdadero cuando comienza y volviendo a establecerlo en falso cuando recibe las notas de autor:

1
  fetchQuotes = () => {
2
    this.setState({...this.state, isFetching: true})
3
    fetch(QUOTE_SERVICE_URL)
4
      .then(response => response.json())
5
      .then(result => this.setState({quotes: result, 
6
                                     isFetching: false}))
7
      .catch(e => console.log(e));
8
  }
9
}

Manejo de errores

Hago el mínimo de manejo de errores aquí registrando los errores detectados en la consola. Dependiendo de tu aplicación, puedes invocar alguna lógica de reintento, notificar al usuario o mostrar algún contenido de respaldo.

Obtener un API frente a Axios

La API de búsqueda tiene un par de trampas. Requiere el paso adicional de extraer el JSON de una respuesta. Tampoco detecta todos los errores. Por ejemplo, 404 se devolverá como una respuesta normal. Tendrás que verificar el código de respuesta y también lidiar con los errores de red que se detectan.

Entonces tendrás que lidiar con los errores en dos lugares. Pero puedes usar la biblioteca axios.js para abordar estos problemas y tener un código un poco más conciso a cambio de agregar una dependencia externa. Así es como se ve el código con axios:

1
  fetchQuotes = () => {
2
    this.setState({...this.state, isFetching: true})
3
    axios.get(QUOTE_SERVICE_URL)
4
      .then(response => this.setState({quotes: response.data, 
5
                                       isFetching: false}))
6
      .catch(e => console.log(e);
7
  }

Esto no parece mucho, pero ayuda. El código para agregar una nueva cita es mucho más conciso con axios. Aquí está la versión de recuperación:

1
  handleSubmitWithFetch = event => {
2
    let data = new FormData()
3
    data.append('quote', this.state.quote)
4
    fetch(this.props.quote_service_url, 
5
          {method: 'POST', body: data})
6
      .then(response => response.json())
7
      .catch(e => console.log(e));
8
9
    event.preventDefault();
10
  }

Y aquí está la versión axios:

1
  handleSubmit = event => {
2
    axios.post(this.props.quote_service_url, 
3
               {'quote': this.state.quote})
4
      .then(r => console.log(r))
5
      .catch(e => console.log(e));
6
7
    event.preventDefault();
8
  }

Conclusión

En este tutorial, aprendiste cómo obtener datos de forma asincrónica en una aplicación React. Hablamos sobre los métodos relevantes del ciclo de vida, el sondeo, los informes de progreso y el manejo de errores.

Analizamos dos bibliotecas basadas en promesas: la API fetch y axios.js. Ahora, sal y crea increíbles aplicaciones React que accedan a API remotas.

En los últimos años, React ha ganado popularidad. De hecho, tenemos varios artículos en el mercado que están disponibles para su compra, revisión, implementación, etc. Si estás buscando recursos adicionales sobre React, no dudes en consultarlos.