Usando ganchos
Los ganchos se introdujeron en 16.8.0, por lo que el siguiente código requiere una versión mínima de 16.8.0 (desplácese hacia abajo para ver el ejemplo de componentes de clase). Demostración de CodeSandbox
1. Establecer el estado principal para el contexto dinámico
En primer lugar, para tener un contexto dinámico que se pueda pasar a los consumidores, usaré el estado del padre. Esto asegura que tengo una única fuente de verdad. Por ejemplo, mi aplicación principal se verá así:
const App = () => {
const [language, setLanguage] = useState("en");
const value = { language, setLanguage };
return (
...
);
};
Se language
almacena en el estado. Pasaremos ambos language
y la función setter a setLanguage
través del contexto más adelante.
2. Crear un contexto
A continuación, creé un contexto de lenguaje como este:
const LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
Aquí estoy configurando los valores predeterminados para language
('en') y una setLanguage
función que será enviada por el proveedor de contexto a los consumidores. Estos son solo valores predeterminados y proporcionaré sus valores cuando use el componente de proveedor en el padre App
.
Nota: lo LanguageContext
mismo sigue siendo si
3. Crear un consumidor de contexto
Para que el selector de idioma configure el idioma, debe tener acceso a la función de configuración de idioma a través del contexto. Puede verse algo como esto:
const LanguageSwitcher = () => {
const { language, setLanguage } = useContext(LanguageContext);
return (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
);
};
Aquí solo estoy configurando el idioma en 'jp', pero es posible que tenga su propia lógica para configurar los idiomas para esto.
4. Envolviendo al consumidor en un proveedor
Ahora renderizaré mi componente de cambio de idioma en ay pasaré LanguageContext.Provider
los valores que deben enviarse a través del contexto a cualquier nivel más profundo. Así es como se App
ve mi padre :
const App = () => {
const [language, setLanguage] = useState("en");
const value = { language, setLanguage };
return (
<LanguageContext.Provider value={value}>
<h2>Current Language: {language}</h2>
<p>Click button to change to jp</p>
<div>
{/* Can be nested */}
<LanguageSwitcher />
</div>
</LanguageContext.Provider>
);
};
Ahora, cada vez que se hace clic en el conmutador de idioma, se actualiza el contexto de forma dinámica.
Demostración de CodeSandbox
Usando componentes de clase
La última API de contexto se introdujo en React 16.3, que proporciona una excelente manera de tener un contexto dinámico. El siguiente código requiere una versión mínima de 16.3.0. Demostración de CodeSandbox
1. Establecer el estado principal para el contexto dinámico
En primer lugar, para tener un contexto dinámico que se pueda pasar a los consumidores, usaré el estado del padre. Esto asegura que tengo una única fuente de verdad. Por ejemplo, mi aplicación principal se verá así:
class App extends Component {
setLanguage = language => {
this.setState({ language });
};
state = {
language: "en",
setLanguage: this.setLanguage
};
...
}
El language
se almacena en el estado junto con un método de establecimiento de idioma, que puede mantener fuera del árbol de estado.
2. Crear un contexto
A continuación, creé un contexto de lenguaje como este:
const LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
Aquí estoy configurando los valores predeterminados para language
('en') y una setLanguage
función que será enviada por el proveedor de contexto a los consumidores. Estos son solo valores predeterminados y proporcionaré sus valores cuando use el componente de proveedor en el padre App
.
3. Crear un consumidor de contexto
Para que el selector de idioma configure el idioma, debe tener acceso a la función de configuración de idioma a través del contexto. Puede verse algo como esto:
class LanguageSwitcher extends Component {
render() {
return (
<LanguageContext.Consumer>
{({ language, setLanguage }) => (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
)}
</LanguageContext.Consumer>
);
}
}
Aquí solo estoy configurando el idioma en 'jp', pero es posible que tenga su propia lógica para configurar los idiomas para esto.
4. Envolviendo al consumidor en un proveedor
Ahora renderizaré mi componente de cambio de idioma en ay pasaré LanguageContext.Provider
los valores que deben enviarse a través del contexto a cualquier nivel más profundo. Así es como se App
ve mi padre :
class App extends Component {
setLanguage = language => {
this.setState({ language });
};
state = {
language: "en",
setLanguage: this.setLanguage
};
render() {
return (
<LanguageContext.Provider value={this.state}>
<h2>Current Language: {this.state.language}</h2>
<p>Click button to change to jp</p>
<div>
{/* Can be nested */}
<LanguageSwitcher />
</div>
</LanguageContext.Provider>
);
}
}
Ahora, cada vez que se hace clic en el conmutador de idioma, se actualiza el contexto de forma dinámica.
Demostración de CodeSandbox