Relay és un framework de JavaScript desenvolupat per Facebook que s'utilitza per construir aplicacions React que utilitzen GraphQL. Relay està dissenyat per gestionar de manera eficient les dades de les aplicacions, oferint una experiència d'usuari ràpida i fluida. En aquest tema, explorarem els conceptes bàsics de Relay, com configurar-lo i com utilitzar-lo per fer consultes i mutacions.

Continguts

Introducció a Relay

Relay és un framework que facilita la gestió de dades en aplicacions React utilitzant GraphQL. Algunes de les característiques clau de Relay són:

  • Declaratiu: Defineixes les dades que necessita cada component de manera declarativa.
  • Eficiència: Optimitza les consultes per minimitzar la quantitat de dades transferides.
  • Consistència: Manté la consistència de les dades a través de la Relay Store.

Configuració de Relay

Per començar a utilitzar Relay en una aplicació React, necessitem configurar-lo. A continuació es mostren els passos bàsics per configurar Relay:

  1. Instal·lació de dependències:

    npm install react-relay relay-runtime graphql
    
  2. Configuració de l'entorn de compilació:

    Relay necessita un entorn de compilació per processar les consultes GraphQL. Això es fa mitjançant relay-compiler.

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

    Afegeix el següent a la configuració de Babel (.babelrc):

    {
      "plugins": ["relay"]
    }
    
  3. Configuració del Relay Environment:

    Crea un fitxer RelayEnvironment.js per configurar l'entorn de Relay.

    import { Environment, Network, RecordSource, Store } from 'relay-runtime';
    
    function fetchQuery(operation, variables) {
      return fetch('/graphql', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          query: operation.text,
          variables,
        }),
      }).then(response => response.json());
    }
    
    const environment = new Environment({
      network: Network.create(fetchQuery),
      store: new Store(new RecordSource()),
    });
    
    export default environment;
    
  4. Integració amb React:

    Utilitza el RelayEnvironment en la teva aplicació React.

    import React from 'react';
    import ReactDOM from 'react-dom';
    import { RelayEnvironmentProvider } from 'react-relay/hooks';
    import environment from './RelayEnvironment';
    import App from './App';
    
    ReactDOM.render(
      <RelayEnvironmentProvider environment={environment}>
        <App />
      </RelayEnvironmentProvider>,
      document.getElementById('root')
    );
    

Consultes amb Relay

Relay utilitza el concepte de fragments per definir les dades que necessita cada component. A continuació es mostra un exemple de com fer una consulta amb Relay:

  1. Definició del fragment:

    import { graphql } from 'react-relay';
    
    const userFragment = graphql`
      fragment UserFragment on User {
        id
        name
        email
      }
    `;
    
  2. Utilització del fragment en un component:

    import React from 'react';
    import { useFragment } from 'react-relay/hooks';
    import userFragment from './UserFragment';
    
    function UserComponent(props) {
      const data = useFragment(userFragment, props.user);
    
      return (
        <div>
          <h1>{data.name}</h1>
          <p>{data.email}</p>
        </div>
      );
    }
    
    export default UserComponent;
    

Mutacions amb Relay

Les mutacions en Relay es defineixen de manera similar a les consultes. A continuació es mostra un exemple de com fer una mutació amb Relay:

  1. Definició de la mutació:

    import { graphql, commitMutation } from 'react-relay';
    import environment from './RelayEnvironment';
    
    const mutation = graphql`
      mutation AddUserMutation($input: AddUserInput!) {
        addUser(input: $input) {
          user {
            id
            name
            email
          }
        }
      }
    `;
    
    function addUser(input) {
      return commitMutation(environment, {
        mutation,
        variables: { input },
        onCompleted: (response, errors) => {
          console.log('Response received from server.');
        },
        onError: err => console.error(err),
      });
    }
    
    export default addUser;
    
  2. Utilització de la mutació en un component:

    import React, { useState } from 'react';
    import addUser from './AddUserMutation';
    
    function AddUserComponent() {
      const [name, setName] = useState('');
      const [email, setEmail] = useState('');
    
      const handleSubmit = (e) => {
        e.preventDefault();
        addUser({ name, email });
      };
    
      return (
        <form onSubmit={handleSubmit}>
          <input
            type="text"
            value={name}
            onChange={(e) => setName(e.target.value)}
            placeholder="Name"
          />
          <input
            type="email"
            value={email}
            onChange={(e) => setEmail(e.target.value)}
            placeholder="Email"
          />
          <button type="submit">Add User</button>
        </form>
      );
    }
    
    export default AddUserComponent;
    

Fragments de Relay

Els fragments són una part essencial de Relay, ja que permeten definir les dades que necessita cada component de manera modular. Això facilita la reutilització i la composició de components.

Exemple de fragment

import { graphql } from 'react-relay';

const userFragment = graphql`
  fragment UserFragment on User {
    id
    name
    email
  }
`;

export default userFragment;

Gestió de dades amb Relay Store

Relay Store és el lloc on Relay emmagatzema les dades recuperades de les consultes GraphQL. Això permet a Relay mantenir la consistència de les dades i optimitzar les consultes.

Exemple d'actualització de la Relay Store

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

const mutation = graphql`
  mutation UpdateUserMutation($input: UpdateUserInput!) {
    updateUser(input: $input) {
      user {
        id
        name
        email
      }
    }
  }
`;

function updateUser(input) {
  return commitMutation(environment, {
    mutation,
    variables: { input },
    updater: (store) => {
      const payload = store.getRootField('updateUser');
      const updatedUser = payload.getLinkedRecord('user');
      const userId = updatedUser.getValue('id');
      const userRecord = store.get(userId);
      userRecord.setValue(updatedUser.getValue('name'), 'name');
      userRecord.setValue(updatedUser.getValue('email'), 'email');
    },
    onCompleted: (response, errors) => {
      console.log('Response received from server.');
    },
    onError: err => console.error(err),
  });
}

export default updateUser;

Exercicis pràctics

Exercici 1: Configuració de Relay

  1. Configura un nou projecte React amb Relay.
  2. Crea un RelayEnvironment i integra'l amb la teva aplicació React.

Exercici 2: Consultes amb Relay

  1. Defineix un fragment per a un tipus User.
  2. Utilitza el fragment en un component per mostrar les dades d'un usuari.

Exercici 3: Mutacions amb Relay

  1. Defineix una mutació per afegir un nou usuari.
  2. Crea un formulari en un component React per afegir un nou usuari utilitzant la mutació.

Solucions

Solució a l'Exercici 1

// RelayEnvironment.js
import { Environment, Network, RecordSource, Store } from 'relay-runtime';

function fetchQuery(operation, variables) {
  return fetch('/graphql', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      query: operation.text,
      variables,
    }),
  }).then(response => response.json());
}

const environment = new Environment({
  network: Network.create(fetchQuery),
  store: new Store(new RecordSource()),
});

export default environment;

Solució a l'Exercici 2

// UserFragment.js
import { graphql } from 'react-relay';

const userFragment = graphql`
  fragment UserFragment on User {
    id
    name
    email
  }
`;

export default userFragment;

// UserComponent.js
import React from 'react';
import { useFragment } from 'react-relay/hooks';
import userFragment from './UserFragment';

function UserComponent(props) {
  const data = useFragment(userFragment, props.user);

  return (
    <div>
      <h1>{data.name}</h1>
      <p>{data.email}</p>
    </div>
  );
}

export default UserComponent;

Solució a l'Exercici 3

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

const mutation = graphql`
  mutation AddUserMutation($input: AddUserInput!) {
    addUser(input: $input) {
      user {
        id
        name
        email
      }
    }
  }
`;

function addUser(input) {
  return commitMutation(environment, {
    mutation,
    variables: { input },
    onCompleted: (response, errors) => {
      console.log('Response received from server.');
    },
    onError: err => console.error(err),
  });
}

export default addUser;

// AddUserComponent.js
import React, { useState } from 'react';
import addUser from './AddUserMutation';

function AddUserComponent() {
  const [name, setName] = useState('');
  const [email, setEmail] = useState('');

  const handleSubmit = (e) => {
    e.preventDefault();
    addUser({ name, email });
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        value={name}
        onChange={(e) => setName(e.target.value)}
        placeholder="Name"
      />
      <input
        type="email"
        value={email}
        onChange={(e) => setEmail(e.target.value)}
        placeholder="Email"
      />
      <button type="submit">Add User</button>
    </form>
  );
}

export default AddUserComponent;

Conclusió

Relay és una eina poderosa per gestionar dades en aplicacions React utilitzant GraphQL. En aquest tema, hem après a configurar Relay, fer consultes i mutacions, utilitzar fragments i gestionar dades amb Relay Store. Amb aquests coneixements, estàs preparat per començar a construir aplicacions React eficients i escalables amb Relay.

© Copyright 2024. Tots els drets reservats