Relay es una biblioteca de JavaScript desarrollada por Facebook que se utiliza para gestionar datos en aplicaciones React utilizando GraphQL. Relay se centra en la eficiencia, la consistencia y la escalabilidad, permitiendo a los desarrolladores construir aplicaciones rápidas y robustas.

Objetivos de Aprendizaje

Al final de esta sección, deberías ser capaz de:

  1. Comprender qué es Relay y por qué se utiliza.
  2. Configurar un entorno básico de Relay.
  3. Realizar consultas y mutaciones utilizando Relay.
  4. Implementar fragmentos y contenedores de datos en Relay.

¿Qué es Relay?

Relay es una biblioteca de gestión de datos para aplicaciones React que utiliza GraphQL para especificar los datos que necesita una aplicación. Relay se encarga de:

  • Obtener datos: Realiza consultas a un servidor GraphQL para obtener los datos necesarios.
  • Actualizar datos: Maneja mutaciones para actualizar los datos en el servidor.
  • Optimizar el rendimiento: Minimiza la cantidad de datos transferidos y optimiza las actualizaciones de la interfaz de usuario.

Ventajas de Usar Relay

  • Declarativo: Especificas los datos que necesitas y Relay se encarga de obtenerlos.
  • Consistencia: Mantiene una caché de los datos para asegurar que la interfaz de usuario esté siempre sincronizada con el estado del servidor.
  • Escalabilidad: Diseñado para aplicaciones grandes y complejas.

Configuración de un Entorno Básico de Relay

Requisitos Previos

  • Node.js y npm instalados.
  • Conocimientos básicos de React y GraphQL.

Instalación

Primero, instala las dependencias necesarias:

npm install react-relay relay-runtime graphql

Configuración del Entorno

  1. Configura Babel: Relay requiere Babel para transformar el código. Instala las dependencias de Babel:

    npm install --save-dev babel-plugin-relay
    

    Luego, añade el plugin de Relay a tu configuración de Babel (.babelrc):

    {
      "plugins": ["relay"]
    }
    
  2. Configura Relay Compiler: Relay Compiler es una herramienta que analiza tus consultas GraphQL y genera código optimizado. Instálalo:

    npm install --save-dev relay-compiler
    

    Añade un script en tu package.json para ejecutar Relay Compiler:

    "scripts": {
      "relay": "relay-compiler --src ./src --schema ./schema.graphql"
    }
    

    Asegúrate de tener un archivo de esquema GraphQL (schema.graphql) en tu proyecto.

Realizando Consultas con Relay

Definiendo una Consulta

Crea un archivo de consulta GraphQL (MyQuery.graphql):

query MyQuery {
  viewer {
    id
    name
  }
}

Creando un Contenedor de Datos

Crea un componente React que utilice la consulta:

import React from 'react';
import { QueryRenderer, graphql } from 'react-relay';
import environment from './environment'; // Configura tu entorno de Relay

const MyComponent = ({ viewer }) => (
  <div>
    <h1>{viewer.name}</h1>
  </div>
);

const MyQueryRenderer = () => (
  <QueryRenderer
    environment={environment}
    query={graphql`
      query MyQuery {
        viewer {
          id
          name
        }
      }
    `}
    render={({ error, props }) => {
      if (error) {
        return <div>Error: {error.message}</div>;
      }
      if (!props) {
        return <div>Loading...</div>;
      }
      return <MyComponent viewer={props.viewer} />;
    }}
  />
);

export default MyQueryRenderer;

Explicación del Código

  • QueryRenderer: Componente de Relay que ejecuta una consulta GraphQL y renderiza el resultado.
  • environment: Configuración de Relay que define cómo se comunican las consultas con el servidor GraphQL.
  • graphql: Etiqueta de plantilla que define la consulta GraphQL.

Realizando Mutaciones con Relay

Definiendo una Mutación

Crea un archivo de mutación GraphQL (MyMutation.graphql):

mutation MyMutation($input: MyInput!) {
  myMutation(input: $input) {
    viewer {
      id
      name
    }
  }
}

Creando una Mutación en Relay

Crea un archivo de mutación en JavaScript:

import { commitMutation, graphql } from 'react-relay';
import environment from './environment';

const mutation = graphql`
  mutation MyMutation($input: MyInput!) {
    myMutation(input: $input) {
      viewer {
        id
        name
      }
    }
  }
`;

function commit(input, onCompleted, onError) {
  return commitMutation(environment, {
    mutation,
    variables: { input },
    onCompleted,
    onError,
  });
}

export default { commit };

Usando la Mutación en un Componente

Crea un componente React que utilice la mutación:

import React from 'react';
import MyMutation from './MyMutation';

class MyComponent extends React.Component {
  handleClick = () => {
    const input = { /* datos de entrada */ };
    MyMutation.commit(input, response => {
      console.log('Respuesta:', response);
    }, error => {
      console.error('Error:', error);
    });
  };

  render() {
    return (
      <button onClick={this.handleClick}>
        Ejecutar Mutación
      </button>
    );
  }
}

export default MyComponent;

Explicación del Código

  • commitMutation: Función de Relay para ejecutar una mutación.
  • mutation: Definición de la mutación GraphQL.
  • commit: Función que ejecuta la mutación con las variables de entrada y callbacks para manejar la respuesta y errores.

Fragmentos y Contenedores de Datos

Definiendo un Fragmento

Crea un archivo de fragmento GraphQL (MyFragment.graphql):

fragment MyFragment on Viewer {
  id
  name
}

Usando el Fragmento en un Componente

Crea un componente React que utilice el fragmento:

import React from 'react';
import { createFragmentContainer, graphql } from 'react-relay';

const MyComponent = ({ viewer }) => (
  <div>
    <h1>{viewer.name}</h1>
  </div>
);

export default createFragmentContainer(MyComponent, {
  viewer: graphql`
    fragment MyFragment on Viewer {
      id
      name
    }
  `
});

Explicación del Código

  • createFragmentContainer: Función de Relay que crea un contenedor de datos para un componente React.
  • fragment: Definición del fragmento GraphQL.

Ejercicio Práctico

Ejercicio

  1. Configura un entorno de Relay en una aplicación React.
  2. Crea una consulta GraphQL para obtener una lista de usuarios.
  3. Implementa un componente React que utilice la consulta para mostrar la lista de usuarios.
  4. Crea una mutación GraphQL para añadir un nuevo usuario.
  5. Implementa un componente React que utilice la mutación para añadir un nuevo usuario a la lista.

Solución

  1. Configura el entorno siguiendo los pasos de la sección "Configuración de un Entorno Básico de Relay".

  2. Crea la consulta (UsersQuery.graphql):

    query UsersQuery {
      users {
        id
        name
      }
    }
    
  3. Implementa el componente (UsersList.js):

    import React from 'react';
    import { QueryRenderer, graphql } from 'react-relay';
    import environment from './environment';
    
    const UsersList = ({ users }) => (
      <ul>
        {users.map(user => (
          <li key={user.id}>{user.name}</li>
        ))}
      </ul>
    );
    
    const UsersQueryRenderer = () => (
      <QueryRenderer
        environment={environment}
        query={graphql`
          query UsersQuery {
            users {
              id
              name
            }
          }
        `}
        render={({ error, props }) => {
          if (error) {
            return <div>Error: {error.message}</div>;
          }
          if (!props) {
            return <div>Loading...</div>;
          }
          return <UsersList users={props.users} />;
        }}
      />
    );
    
    export default UsersQueryRenderer;
    
  4. Crea la mutación (AddUserMutation.graphql):

    mutation AddUserMutation($input: AddUserInput!) {
      addUser(input: $input) {
        user {
          id
          name
        }
      }
    }
    
  5. Implementa el componente (AddUser.js):

    import React, { useState } from 'react';
    import AddUserMutation from './AddUserMutation';
    
    const AddUser = () => {
      const [name, setName] = useState('');
    
      const handleAddUser = () => {
        const input = { name };
        AddUserMutation.commit(input, response => {
          console.log('Usuario añadido:', response);
        }, error => {
          console.error('Error:', error);
        });
      };
    
      return (
        <div>
          <input
            type="text"
            value={name}
            onChange={e => setName(e.target.value)}
            placeholder="Nombre del usuario"
          />
          <button onClick={handleAddUser}>
            Añadir Usuario
          </button>
        </div>
      );
    };
    
    export default AddUser;
    

Conclusión

En esta sección, hemos aprendido sobre Relay, una poderosa biblioteca para gestionar datos en aplicaciones React utilizando GraphQL. Hemos cubierto cómo configurar un entorno básico de Relay, realizar consultas y mutaciones, y utilizar fragmentos y contenedores de datos. Relay ofrece una forma eficiente y escalable de manejar datos en aplicaciones React, asegurando que la interfaz de usuario esté siempre sincronizada con el estado del servidor.

En el próximo módulo, exploraremos las suscripciones de GraphQL, que permiten a las aplicaciones recibir actualizaciones en tiempo real desde el servidor.

© Copyright 2024. Todos los derechos reservados