PDF: páginas 158–161 (libro: 154–157)
← Índice | ← Anterior: 28.3. Useeffect | Siguiente: 28.4. Usecontext →
En este laboratorio vamos a ver como usar el hook useContext para traducir los textos de laaplicación.
Vamos a copiar la plantilla del proyecto que se ha realizado en el laboratorio reactjs-proyecto- inicial y vamos a cambiarle el nombre del proyecto a reactjs-hooks-usecontext-lab.
Es posible que sea necesario volver a instalar las dependencias del proyecto para que funcione correctamente. Para ello solo tenemos que lanzar el comando npm install dentro de la carpeta del proyecto.
Ahora vamos a levantar el servidor de desarrollo con el comando:
$ npm startLo primero que vamos a hacer es crear el componente Context, en el que vamos a crear un contexto de React (que exportaremos) y añadiremos un objeto con las traducciones de nuestra aplicación en distintos idiomas.
Archivo: /reactjs-hooks-usecontext-lab/src/components/Context.tsx
import React from 'react'
export const LangCtx = React.createContext(null)
const traducciones = {
es: {
bienvenida: 'Bienvenido a mi Startup'
},
en: {
bienvenida: 'Welcome to my Startup'
},
fr: {
bienvenida: 'Bienvenue dans ma Startup'
}
}
const Context = () => {
return (
<div>
</div>
)
}
export default ContextAhora vamos a añadir este componente dentro del componente raíz de la aplicación.
Archivo: /reactjs-hooks-usecontext-lab/src/components/App.tsx
import React, { Component } from 'react'
import Context from './Context'
class App extends Component {
render() {
return (
<div>
<Context />
</div>
)
}
}
export default AppAhora vamos a crearnos un componente SelectLang que tendrá un desplegable para poder mostrar los distintos idiomas y seleccionar en cual queremos que se muestre nuestra aplicación. Este componente recibirá como propiedades los distintos lenguajes, el lenguaje seleccionado y la función que cambia de lenguaje.
Archivo: /reactjs-hooks-usecontext-lab/src/components/SelectLang.tsx
import React from 'react';
const SelectLang = ({langs, onChangeLang, selectedLang}) => {
const optionsLang = langs.map((l, pos) => <option key={pos} value={l}>{l.toUpperCase()}</option>)
return (
<select onChange={(e) => onChangeLang(e.target.value)} value={selectedLang}>
{optionsLang}
</select>
)
}
export default SelectLangUna vez que tenemos el componente, vamos a añadirlo en el componente Context, donde añadiremos el estado que guarda el lenguaje seleccionado.
Archivo: /reactjs-hooks-usecontext-lab/src/components/Context.tsx
import React, { useState } from 'react'
import SelectLang from './SelectLang'
export const LangCtx = React.createContext(null)
const traducciones = {
es: {
bienvenida: 'Bienvenido a mi Startup'
},
en: {
bienvenida: 'Welcome to my Startup'
},
fr: {
bienvenida: 'Bienvenue dans ma Startup'
}
}
const Context = () => {
const [lang, setLang] = useState('es')
return (
<div>
<SelectLang langs={Object.keys(traducciones)} onChangeLang={setLang} selectedLang={lang} />
</div>
)
}
export default ContextAhora ya deberíamos de poder ver el desplegable y cambiar el valor del lenguaje.
Lo siguiente es crear el componente Header en el que usaremos el hook del useContext parapasarle las traducciones correspondientes al lenguaje seleccionado y así mostrar el título en distintos idiomas.
En este componente importaremos el LangCtx que hemos creado anteriormente para pasarselo al hook y que nos devuelva el valor que nos provee el contexto, para así poder mostrarlo.
Archivo: /reactjs-hooks-usecontext-lab/src/components/Header.tsx
import React, { useContext } from 'react'
import { LangCtx } from './Context'
const Header = () => {
const {bienvenida} = useContext(LangCtx)
return (
<h1>{bienvenida}</h1>
)
}
export default HeaderPor último, nos faltaría envolver este componente con el Provider y pasarle el valor a través de esta etiqueta desde el componenten Context.
Archivo: /reactjs-hooks-usecontext-lab/src/components/Context.tsx
import React, { useState } from 'react'
import SelectLang from './SelectLang'
import Header from './Header'
export const LangCtx = React.createContext(null)
const traducciones = {
es: {
bienvenida: 'Bienvenido a mi Startup'
},
en: {
bienvenida: 'Welcome to my Startup'
},
fr: {
bienvenida: 'Bienvenue dans ma Startup'
}
}
const Context = () => {
const [lang, setLang] = useState('es')
return (
<div>
<SelectLang langs={Object.keys(traducciones)} onChangeLang={setLang} selectedLang={lang} />
<LangCtx.Provider value={traducciones[lang]}>
<Header />
</LangCtx.Provider>
</div>
)
}
export default ContextY con lo que acabamos de hacer ya debería de cambiar el texto del header al lenguaje que hayamos seleccionado en el desplegable.