43

Tutorial: Cómo acceder a los datos de tu aplicación sin sufrimiento con React Context API

16450Puntos

hace 6 años

¿Ya sabes cómo funciona React Context API? En este tutorial te enseñaré cómo compartir datos entre componentes sin necesidad de pasarlos como propiedades componente tras componente. Esto nos ahorrará algunos enredos que probablemente tengamos en nuestras aplicaciones hechas con React o que resolvemos con librerías como Redux. Para poder hacer uso de React Context API necesitarás tener instalada la versión 16.3 de React en tu proyecto.

Entonces, ¿cuál era la forma en la que pasábamos datos entre componentes con React antes de esto? Supongamos que tengo un componente padre llamado App, y dentro de ese componente mando llamar a mi componente Playlist y dentro de Playlist se llama al componente Song.

importReact, { Component} from 'react';

classAppextendsComponent{
	state = {
		title: 'Despacito',
		artist: 'LuisFonsi',
		released: '2017',
	}
	render() {
		return(
			<Playlist />
		);
	}
}

classPlaylistextendsComponent{
	render() {
		return(
			<Song />
		);
	}
}

classSongextendsComponent{
	render() {
		return(
			<div>Canción</div>
		);
	}
}

export defaultApp;

Ahora, ¿qué pasa si quiero utilizar los datos de la canción dentro del componente Song? Tendría que pasarlos como propiedades a través de cada componente. O sea:

importReact, { Component} from 'react';

classAppextendsComponent{
	state = {
		title: 'Despacito',
		artist: 'LuisFonsi',
		released: '2017',
	}
	render() {
		return(
			<Playlist title={this.state.title}/ />
		);
	}
}

classPlaylistextendsComponent{
	render() {
		return(
			<Song title={this.props.title} />
		);
	}
}

classSongextendsComponent{
	render() {
		return(
			<div>Canción: {this.props.title}</div>
		);
	}
}

export defaultApp;

Si continuamos así, entre más niveles de profundidad tenga nuestra aplicación todo se volverá más enredado y puede terminar en un desastre. Es por eso, que muchos decidimos comenzamos a utilizar un contenedor de estados como Redux e inyectar los datos en el componente en el que lo necesitemos. El Contexto en React 16.3 funciona de manera similar. Para que funcione necesitamos un Provider y un Consumer. Lo primero que haremos será crear nuestro nuevo contexto, agregando el siguiente código:

const AppContext = React.createContext();

Lo siguente será crear nuestro Provider, el lugar en donde vivirán nuestros datos. Con la propiedad value pasaremos los datos a los que queremos acceder en nuestra aplicación.

classAppProviderextendsComponent{
	state = {
		title: 'Despacito',
		artist: 'LuisFonsi',
		released: '2017',
	}
	render() {
		return(
			<AppContext.Provider value={{state: this.state}}>
				{this.props.children}
			</AppContext.Provider>
		);
	}
}

Nuestro Provider deberá ser siempre el componente de más alto nivel en nuestra aplicación, por lo que envolveremos nuestro componente principal App con el. De igual forma quitaremos los datos de este componente, pues ya no será necesario porque vivirán en el Provider.

classAppextendsComponent{
	render() {
		return(
			<AppProvider>
				<Playlist />
			</AppProvider>
		);
	}
}

De esta forma, por más profundo que sea el nivel del componente en el querramos acceder a los datos, no habrá problema y podremos hacerlo. Ahora, ¿cómo hago para acceder a los datos de la canción desde el componente Song? Para eso necesitamos llamar a nuestro Consumer, siempre en el componente en donde queremos acceder a nuestros datos, en este caso el componente Song . El hijo de nuestro Consumer siempre va a ser una función que recibirá el contexto como parámetro y retornará la estructura y los datos que necesitemos. En el contexto es donde se encuentran todos los datos que asignamos a la propiedad value en el Provider.

classSongextendsComponent{
	render() {
		return(
			<div>Canción:
				<AppContext.Consumer>
					{(context) => (
						<p>{context.state.song}</p>
					)}
				</AppContext.Consumer>
			</div>
		);
	}
}

Y de esta forma es como accedemos a los datos sin necesidad de estarlos pasando como propiedades a través de cada componente. Espero que este pequeño ejemplo les haya ayudado a tener una idea más clara de cómo podemos hacer esto con react y sin necesidad de librerías externas. Dejen todas sus dudas en los comentarios y con gusto las responderé.

Stefanny
Stefanny
fannytaviles

16450Puntos

hace 6 años

Todas sus entradas
Escribe tu comentario
+ 2
Ordenar por:
1
2089Puntos

Grandioso, es ingenioso poner el context en un app context, no se me habia ocurrido

1
17200Puntos

Hola me salta una duda, en el ultimo trozo de codigo porque es {context.state.song} no debía ser {context.state.title}.

Gracias por la explicación

1

el Context cuando estemos en produccion, la extension de react devTools lo podra exponer?

Ejemplo si requiero guardar un dato sencible un key especial o un password que emplee mi aplicacion como la puedo almacenar desde el fronted

1
5 años

Gracias de antemano por cualquier respuesta o ayuda que me puedan dan

0
12963Puntos

Wow super claro el concepto y muy fácil de usar. Mil gracias por tu aporte 😃