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:
-
Instal·lació de dependències:
npm install react-relay relay-runtime graphql
-
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"] }
-
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;
-
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:
-
Definició del fragment:
import { graphql } from 'react-relay'; const userFragment = graphql` fragment UserFragment on User { id name email } `;
-
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:
-
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;
-
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
- Configura un nou projecte React amb Relay.
- Crea un
RelayEnvironment
i integra'l amb la teva aplicació React.
Exercici 2: Consultes amb Relay
- Defineix un fragment per a un tipus
User
. - Utilitza el fragment en un component per mostrar les dades d'un usuari.
Exercici 3: Mutacions amb Relay
- Defineix una mutació per afegir un nou usuari.
- 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.
Curs de GraphQL
Mòdul 1: Introducció a GraphQL
- Què és GraphQL?
- GraphQL vs REST
- Configuració d'un servidor GraphQL
- Conceptes bàsics de l'esquema de GraphQL
Mòdul 2: Conceptes bàsics
Mòdul 3: Disseny avançat d'esquemes
Mòdul 4: Treballant amb dades
- Connexió a una base de dades
- Estratègies de recuperació de dades
- Agrupació i emmagatzematge en memòria cau
- Gestió d'errors
Mòdul 5: Rendiment i seguretat
Mòdul 6: Eines i ecosistema
Mòdul 7: Proves i desplegament
- Proves unitàries de resolvers
- Proves d'integració
- Integració contínua
- Desplegament de servidors GraphQL