Haken verwenden
Hooks wurden in 16.8.0 eingeführt, sodass für den folgenden Code eine Mindestversion von 16.8.0 erforderlich ist (scrollen Sie nach unten, um das Beispiel für Klassenkomponenten anzuzeigen). CodeSandbox-Demo
1. Festlegen des übergeordneten Status für den dynamischen Kontext
Um einen dynamischen Kontext zu haben, der an die Verbraucher weitergegeben werden kann, verwende ich zunächst den Status der Eltern. Dies stellt sicher, dass ich eine einzige Quelle der Wahrheit habe. Zum Beispiel sieht meine übergeordnete App folgendermaßen aus:
const App = () => {
const [language, setLanguage] = useState("en");
const value = { language, setLanguage };
return (
...
);
};
Das language
ist im Zustand gespeichert. Wir werden beide language
und die Setter-Funktion setLanguage
später über den Kontext übergeben.
2. Erstellen eines Kontexts
Als nächstes habe ich einen Sprachkontext wie folgt erstellt:
const LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
Hier setze ich die Standardeinstellungen für language
('en') und eine setLanguage
Funktion, die vom Kontextanbieter an die Verbraucher gesendet wird. Dies sind nur Standardeinstellungen, und ich werde ihre Werte angeben, wenn die Anbieterkomponente im übergeordneten Element verwendet wird App
.
Hinweis: Das LanguageContext
bleibt gleich, ob Sie
3. Erstellen eines Kontextkonsumenten
Damit der Sprachumschalter die Sprache einstellen kann, sollte er über den Kontext Zugriff auf die Spracheinstellungsfunktion haben. Es kann ungefähr so aussehen:
const LanguageSwitcher = () => {
const { language, setLanguage } = useContext(LanguageContext);
return (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
);
};
Hier setze ich nur die Sprache auf 'jp', aber Sie haben möglicherweise Ihre eigene Logik, um Sprachen dafür festzulegen.
4. Einwickeln des Verbrauchers in einen Anbieter
Jetzt werde ich meine Sprachumschaltkomponente in a rendern LanguageContext.Provider
und die Werte, die über den Kontext gesendet werden müssen, an eine tiefere Ebene übergeben. So sehen meine Eltern App
aus:
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>
);
};
Wenn Sie jetzt auf den Sprachumschalter klicken, wird der Kontext dynamisch aktualisiert.
CodeSandbox-Demo
Klassenkomponenten verwenden
Die neueste Kontext-API wurde in React 16.3 eingeführt und bietet eine hervorragende Möglichkeit, einen dynamischen Kontext zu erstellen. Der folgende Code erfordert eine Mindestversion von 16.3.0. CodeSandbox-Demo
1. Festlegen des übergeordneten Status für den dynamischen Kontext
Um einen dynamischen Kontext zu haben, der an die Verbraucher weitergegeben werden kann, verwende ich zunächst den Status der Eltern. Dies stellt sicher, dass ich eine einzige Quelle der Wahrheit habe. Zum Beispiel sieht meine übergeordnete App folgendermaßen aus:
class App extends Component {
setLanguage = language => {
this.setState({ language });
};
state = {
language: "en",
setLanguage: this.setLanguage
};
...
}
Das language
wird im Status zusammen mit einer Sprachsetzermethode gespeichert, die Sie möglicherweise außerhalb des Statusbaums aufbewahren.
2. Erstellen eines Kontexts
Als nächstes habe ich einen Sprachkontext wie folgt erstellt:
const LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
Hier setze ich die Standardeinstellungen für language
('en') und eine setLanguage
Funktion, die vom Kontextanbieter an die Verbraucher gesendet wird. Dies sind nur Standardeinstellungen, und ich werde ihre Werte angeben, wenn die Anbieterkomponente im übergeordneten Element verwendet wird App
.
3. Erstellen eines Kontextkonsumenten
Damit der Sprachumschalter die Sprache einstellen kann, sollte er über den Kontext Zugriff auf die Spracheinstellungsfunktion haben. Es kann ungefähr so aussehen:
class LanguageSwitcher extends Component {
render() {
return (
<LanguageContext.Consumer>
{({ language, setLanguage }) => (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
)}
</LanguageContext.Consumer>
);
}
}
Hier setze ich nur die Sprache auf 'jp', aber Sie haben möglicherweise Ihre eigene Logik, um Sprachen dafür festzulegen.
4. Einwickeln des Verbrauchers in einen Anbieter
Jetzt werde ich meine Sprachumschaltkomponente in a rendern LanguageContext.Provider
und die Werte, die über den Kontext gesendet werden müssen, an eine tiefere Ebene übergeben. So sehen meine Eltern App
aus:
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>
);
}
}
Wenn Sie jetzt auf den Sprachumschalter klicken, wird der Kontext dynamisch aktualisiert.
CodeSandbox-Demo