Estoy aprendiendo Relay ahora y me preguntaba si hay una manera de acceder al estado sin tener que pasar accesorios. Pensé que Relay usaba React Context, sin embargo, en todos los ejemplos parecen estar usando accesorios para pasar el estado en lugar de acceder directamente a la tienda Context. ¿Es posible acceder al estado a través de Contexto? Si es así, ¿se considera una mala práctica?
Mi preocupación es que comenzaré a tener muchos accesorios que se transmitirán a los componentes. Además, es difícil transmitir accesorios a ciertos componentes de mi aplicación.
Es una mala práctica transmitir el estado de Relay usando context, redux o algún otro tipo de almacenamiento externo. Una de las características principales de la biblioteca es asegurarse de que todos los componentes que necesitan una pieza de datos obtengan esa pieza y ninguna otra pieza. Esta es una de las razones por las que Relay usa un compilador.
Con Relay, los desarrolladores usan un lenguaje declarativo llamado GraphQL para especificar qué datos necesita cada componente, pero no cómo obtenerlos.
[El compilador] permite razonar sobre los componentes de forma aislada, lo que hace que grandes clases de errores sean imposibles
Los subcomponentes deben usar fragmentos . Por ejemplo:
// User.tsx interface UserProps { initialQueryRef: PreloadedQuery<UserQuery> } export default function User({ initialQueryRef }: UserProps) { const { user } = usePreloadedQuery( graphql` query UserQuery($uid: String!) { user(uid: $uid) { uid ...Avatar_fragment ...Biography_fragment # ... } } `, initialQueryRef ) return ( <div> <Avatar user={user} /> <Biography user={user} /> {/* ... */} </div> ) } // Biography.tsx interface BiographyProps { user: Biography_fragment$key // compiler generated type } export default function Biography({ user }: BiographyProps) { const { shortBio, longBio } = useFragment( graphql` fragment Biography_fragment on User { shortBio longBio } `, user ) // ... }Relay se encargará de actualizar los componentes que usan fragmentos cada vez que los datos del fragmento cambien debido a mutaciones, suscripciones, etc. Nunca debería tener que pensar en administrar su estado mediante programación.