Menggunakan pengait
Hooks diperkenalkan di 16.8.0 sehingga kode berikut memerlukan versi minimum 16.8.0 (gulir ke bawah untuk contoh komponen kelas). Demo CodeSandbox
1. Menyetel status induk untuk konteks dinamis
Pertama, agar memiliki konteks dinamis yang dapat diteruskan ke konsumen, saya akan menggunakan status induk. Ini memastikan bahwa saya memiliki satu sumber kebenaran yang muncul. Misalnya, Aplikasi orang tua saya akan terlihat seperti ini:
const App = () => {
const [language, setLanguage] = useState("en");
const value = { language, setLanguage };
return (
...
);
};
The language
disimpan di negara bagian. Kami akan melewatkan keduanya language
dan fungsi penyetel setLanguage
melalui konteks nanti.
2. Menciptakan konteks
Selanjutnya, saya membuat konteks bahasa seperti ini:
const LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
Di sini saya menyetel default untuk language
('en') dan setLanguage
fungsi yang akan dikirim oleh penyedia konteks ke konsumen. Ini hanya default dan saya akan memberikan nilainya saat menggunakan komponen provider di induk App
.
Catatan: LanguageContext
tetap sama apakah Anda
3. Menciptakan konsumen konteks
Agar pengalih bahasa mengatur bahasa, ia harus memiliki akses ke fungsi penyetel bahasa melalui konteks. Ini bisa terlihat seperti ini:
const LanguageSwitcher = () => {
const { language, setLanguage } = useContext(LanguageContext);
return (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
);
};
Di sini saya hanya mengatur bahasa ke 'jp' tetapi Anda mungkin memiliki logika Anda sendiri untuk mengatur bahasa untuk ini.
4. Membungkus konsumen dalam penyedia
Sekarang saya akan membuat komponen pengalih bahasa saya di a LanguageContext.Provider
dan meneruskan nilai-nilai yang harus dikirim melalui konteks ke tingkat yang lebih dalam. Begini App
penampilan orang tua saya :
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>
);
};
Sekarang, setiap kali pengalih bahasa diklik itu memperbarui konteks secara dinamis.
Demo CodeSandbox
Menggunakan komponen kelas
API konteks terbaru diperkenalkan di React 16.3 yang menyediakan cara yang bagus untuk memiliki konteks dinamis. Kode berikut membutuhkan versi minimum 16.3.0. Demo CodeSandbox
1. Menyetel status induk untuk konteks dinamis
Pertama, agar memiliki konteks dinamis yang dapat diteruskan ke konsumen, saya akan menggunakan status induk. Ini memastikan bahwa saya memiliki satu sumber kebenaran yang muncul. Misalnya, Aplikasi orang tua saya akan terlihat seperti ini:
class App extends Component {
setLanguage = language => {
this.setState({ language });
};
state = {
language: "en",
setLanguage: this.setLanguage
};
...
}
Itu language
disimpan di negara bagian bersama dengan metode penyetel bahasa, yang mungkin Anda simpan di luar pohon negara.
2. Menciptakan konteks
Selanjutnya, saya membuat konteks bahasa seperti ini:
const LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
Di sini saya menyetel default untuk language
('en') dan setLanguage
fungsi yang akan dikirim oleh penyedia konteks ke konsumen. Ini hanya default dan saya akan memberikan nilainya saat menggunakan komponen provider di induk App
.
3. Menciptakan konsumen konteks
Agar pengalih bahasa mengatur bahasa, ia harus memiliki akses ke fungsi penyetel bahasa melalui konteks. Ini bisa terlihat seperti ini:
class LanguageSwitcher extends Component {
render() {
return (
<LanguageContext.Consumer>
{({ language, setLanguage }) => (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
)}
</LanguageContext.Consumer>
);
}
}
Di sini saya hanya mengatur bahasa ke 'jp' tetapi Anda mungkin memiliki logika Anda sendiri untuk mengatur bahasa untuk ini.
4. Membungkus konsumen dalam penyedia
Sekarang saya akan membuat komponen pengalih bahasa saya di a LanguageContext.Provider
dan meneruskan nilai-nilai yang harus dikirim melalui konteks ke tingkat yang lebih dalam. Begini App
penampilan orang tua saya :
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>
);
}
}
Sekarang, setiap kali pengalih bahasa diklik itu memperbarui konteks secara dinamis.
Demo CodeSandbox