guide: add context api spanish guide (#26364)
This commit is contained in:
committed by
Randell Dawson
parent
fbf3e83248
commit
15e877bd3c
241
guide/spanish/react/context-api/index.md
Normal file
241
guide/spanish/react/context-api/index.md
Normal file
@ -0,0 +1,241 @@
|
||||
---
|
||||
title: Context API
|
||||
localeTitle: API Context
|
||||
---
|
||||
|
||||
# API Context
|
||||
|
||||
El API Context ha sido implementado desde la versión 16.3 de React.
|
||||
|
||||
Ya existía antes, pero estaba en beta, y así no se recomendía su uso.
|
||||
|
||||
La meta del API Context es permitir los desarrolladores tener una manera fácil
|
||||
de comunicar entre los componentes cuando están separados en la aplicación.
|
||||
Esto también redujó la necesidad de "taladrar propiedades" (pasar las propiedades por varios componentes), lo cual permite un código más limpio, más fácil a mantener y más fácil a actualizar.
|
||||
|
||||
Esto llega su plena potencial cuando queremos compartir los datos que serán
|
||||
accedidos por varios componentes en la aplicación.
|
||||
|
||||
Se base en dos ideas principales: un Provider (proveedor) y un Consumer (consumidor).
|
||||
|
||||
## Provider
|
||||
|
||||
Imaginamos que queremos utilizar una tema en nuestra aplicación. Entonces varios de nuestros componentes van a consumir esta tema. Lo que queremos hacer
|
||||
es proveer una manera fácil para que los componentes pueden acceder las propiedades de la tema.
|
||||
|
||||
En un archivo creado para proveer los datos, theme-context.js, establecemos el Provider, y también el componente Consumer para que nuestros componentes lo pueden consumir.
|
||||
|
||||
```javascript
|
||||
// theme-context.js
|
||||
// Importar a createContext
|
||||
import React, { createContext, Component } from 'react';
|
||||
|
||||
// Intializamos el contexto, con su configuración por defecto
|
||||
const { Provider, Consumer } = createContext({
|
||||
theme: {
|
||||
primary: '#f44336',
|
||||
light: '#ff7961',
|
||||
dark: '#ba000d',
|
||||
darkFont: '#000',
|
||||
lightFont: '#FFF',
|
||||
},
|
||||
});
|
||||
|
||||
// Crear el clase ThemeProvider para que lo puede utilizar nuestra application
|
||||
export class ThemeProvider extends Component {
|
||||
state = {
|
||||
theme: {
|
||||
primary: '#f44336',
|
||||
light: '#ff7961',
|
||||
dark: '#ba000d',
|
||||
darkFont: '#000',
|
||||
lightFont: '#FFF',
|
||||
},
|
||||
};
|
||||
|
||||
// Pasamos el estado que acabamos de poner como el valor inicial para el
|
||||
// consumo de nuestro aplicación.
|
||||
render() {
|
||||
return <Provider value={this.state}>{this.props.children}</Provider>;
|
||||
}
|
||||
}
|
||||
|
||||
export { Consumer as ThemeConsumer };
|
||||
```
|
||||
|
||||
Y luego necesitamos inicializar nuestra aplicación con nuestro Provider.
|
||||
|
||||
```javascript
|
||||
// index.js
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
import App from './app';
|
||||
|
||||
// Importar nuestra proveedora
|
||||
import { ThemeProvider } from './theme-context';
|
||||
|
||||
// Colocando la aplicación dentro del Provider
|
||||
const rootElement = document.getElementById('root');
|
||||
ReactDOM.render(
|
||||
<ThemeProvider>
|
||||
<App />
|
||||
</ThemeProvider>,
|
||||
rootElement
|
||||
);
|
||||
```
|
||||
|
||||
## Consumer
|
||||
|
||||
En el archivo app.js, consumimos la tema utilizando el component ThemeConsumer.
|
||||
|
||||
```javascript
|
||||
// app.js
|
||||
import React from 'react';
|
||||
|
||||
import { ThemeConsumer } from './theme-context';
|
||||
|
||||
// Nuestro botón consume la tema independiente de sus componentes padres.
|
||||
// Lo importante aquí es que no necesitamos taladrar las propiedades
|
||||
const StyledButton = ({ children }) => (
|
||||
<ThemeConsumer>
|
||||
{({ theme }) => (
|
||||
<button
|
||||
style={{
|
||||
color: theme.lightFont,
|
||||
background: theme.primary,
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</button>
|
||||
)}
|
||||
</ThemeConsumer>
|
||||
);
|
||||
|
||||
export default () => (
|
||||
<ThemeConsumer>
|
||||
{({ theme }) => (
|
||||
<div>
|
||||
<h1 style={{ color: theme.primary }}>Themed App</h1>
|
||||
<StyledButton>Mira mi tema</StyledButton>
|
||||
</div>
|
||||
)}
|
||||
</ThemeConsumer>
|
||||
);
|
||||
```
|
||||
|
||||
### Modificar la tema dinamicamente
|
||||
|
||||
Para modificar la tema que se presenta en nuestra aplicación necesitamos proveer una función al contexto que se puede utilizar el consumidor.
|
||||
|
||||
Solo tenemos que añadirla a Provider:
|
||||
|
||||
```javascript
|
||||
// theme-context.js
|
||||
...
|
||||
// Ya estamos incluyendo un método para modificar la tema
|
||||
const { Provider, Consumer } = createContext({
|
||||
theme: {
|
||||
primary: "#f44336",
|
||||
light: "#ff7961",
|
||||
dark: "#ba000d",
|
||||
darkFont: "#000",
|
||||
lightFont: "#FFF",
|
||||
},
|
||||
setTheme: () => {},
|
||||
})
|
||||
|
||||
export class ThemeProvider extends Component {
|
||||
state = {
|
||||
theme: {
|
||||
primary: "#f44336",
|
||||
light: "#ff7961",
|
||||
dark: "#ba000d",
|
||||
darkFont: "#000",
|
||||
lightFont: "#FFF",
|
||||
},
|
||||
// Definimos la función en nuestro estado, que pasaremos como valor inicial
|
||||
// a nuestro proveedor
|
||||
setTheme: theme => this.setState({ theme }),
|
||||
}
|
||||
|
||||
// Pasamos el estado que acabamos de poner como el valor inicial para el
|
||||
// consumo de nuestro aplicación.
|
||||
render() {
|
||||
return <Provider value={this.state}>{this.props.children}</Provider>
|
||||
}
|
||||
}
|
||||
|
||||
export { Consumer as ThemeConsumer }
|
||||
```
|
||||
|
||||
Y luego en el componente consumidor:
|
||||
|
||||
```javascript
|
||||
// app.js
|
||||
import React from 'react';
|
||||
|
||||
import { ThemeConsumer } from './theme-context';
|
||||
|
||||
// Aqui modificamos el boton para utilizar el metodo de cambiar la tema
|
||||
const StyledButton = ({ children, clickHandler }) => (
|
||||
<ThemeConsumer>
|
||||
{({ theme }) => (
|
||||
<button
|
||||
onClick={clickHandler}
|
||||
style={{
|
||||
color: theme.lightFont,
|
||||
background: theme.primary,
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</button>
|
||||
)}
|
||||
</ThemeConsumer>
|
||||
);
|
||||
|
||||
const themes = {
|
||||
red: {
|
||||
primary: '#f44336',
|
||||
light: '#ff7961',
|
||||
dark: '#ba000d',
|
||||
darkFont: '#000',
|
||||
lightFont: '#FFF',
|
||||
},
|
||||
teal: {
|
||||
primary: '#009688',
|
||||
light: '#52c7b8',
|
||||
dark: '#00675b',
|
||||
darkFont: '#000',
|
||||
lightFont: '#FFF',
|
||||
},
|
||||
};
|
||||
|
||||
// Ya estamos incluyendo el metodo "setTheme" para permitir que el usador
|
||||
// puede cambiar la tema de la aplicación
|
||||
export default () => (
|
||||
<ThemeConsumer>
|
||||
{({ theme, setTheme }) => (
|
||||
<div>
|
||||
<h1 style={{ color: theme.primary }}>Themed App</h1>
|
||||
<StyledButton clickHandler={() => setTheme(themes.red)}>
|
||||
Hacer Tema Roja
|
||||
</StyledButton>
|
||||
<StyledButton clickHandler={() => setTheme(themes.teal)}>
|
||||
Hacer Tema Teal
|
||||
</StyledButton>
|
||||
</div>
|
||||
)}
|
||||
</ThemeConsumer>
|
||||
);
|
||||
```
|
||||
|
||||
Son cuatro ideas principales que se debe recordar:
|
||||
|
||||
- Utilizando React.createComponent, crea un componente Provider que se encargue de manejar los datos y un componente Consumer que permite que nuestros componentes pueden consumir los datos.
|
||||
- Envuelve la aplicación con nuestro Provider, para que sean disponibles los datos a nuestros componentes.
|
||||
- Envuelve nuestros componentes con el componente Consumer para que consumen los datos.
|
||||
|
||||
### More Information
|
||||
|
||||
- [React - Context Official Documentation ](https://reactjs.org/docs/context.html)
|
||||
- [Ejemplo en codesandbox](https://codesandbox.io/s/4qr6ly9wjx)
|
Reference in New Issue
Block a user