Kancaları kullanma
Hook'lar 16.8.0'da tanıtıldı, bu nedenle aşağıdaki kod en az 16.8.0 sürümünü gerektirir (sınıf bileşenleri örneği için aşağı kaydırın). CodeSandbox Demosu
1. Dinamik bağlam için üst durumu ayarlama
İlk olarak, tüketicilere aktarılabilecek dinamik bir bağlama sahip olmak için ebeveynin durumunu kullanacağım. Bu, benim tek bir doğruluk kaynağımın ortaya çıkmasını sağlar. Örneğin, ebeveyn uygulamam şöyle görünecek:
const App = () => {
const [language, setLanguage] = useState("en");
const value = { language, setLanguage };
return (
...
);
};
language
Halde depolanır. Her ikisini de language
ve ayarlayıcı işlevini setLanguage
daha sonra bağlam aracılığıyla geçireceğiz .
2. Bir bağlam oluşturmak
Sonra, bunun gibi bir dil bağlamı oluşturdum:
const LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
Burada language
('en') için varsayılanları setLanguage
ve içerik sağlayıcı tarafından tüketicilere gönderilecek bir işlevi ayarlıyorum . Bunlar yalnızca varsayılanlardır ve üst öğede sağlayıcı bileşenini kullanırken değerlerini sağlayacağım App
.
Not: LanguageContext
aynı kalır
3. Bir bağlam tüketicisi oluşturma
Dil değiştiricinin dili ayarlaması için, bağlam aracılığıyla dil belirleyici işlevine erişebilmesi gerekir. Şunun gibi görünebilir:
const LanguageSwitcher = () => {
const { language, setLanguage } = useContext(LanguageContext);
return (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
);
};
Burada dili 'jp' olarak ayarlıyorum ama bunun için dilleri ayarlamak için kendi mantığınız olabilir.
4. Tüketiciyi bir sağlayıcıya sarmak
Şimdi dil değiştirici bileşenimi a'da oluşturacağım LanguageContext.Provider
ve bağlam aracılığıyla gönderilmesi gereken değerleri daha derine aktaracağım. İşte ebeveynim App
şöyle görünüyor:
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>
);
};
Artık, dil değiştirici her tıklandığında bağlamı dinamik olarak günceller.
CodeSandbox Demosu
Sınıf bileşenlerini kullanma
En son bağlam API'si , dinamik bir bağlama sahip olmanın harika bir yolunu sağlayan React 16.3'te tanıtıldı. Aşağıdaki kod, minimum 16.3.0 sürümünü gerektirir. CodeSandbox Demosu
1. Dinamik bağlam için üst durumu ayarlama
İlk olarak, tüketicilere aktarılabilecek dinamik bir bağlama sahip olmak için ebeveynin durumunu kullanacağım. Bu, benim tek bir doğruluk kaynağımın ortaya çıkmasını sağlar. Örneğin, ebeveyn uygulamam şöyle görünecek:
class App extends Component {
setLanguage = language => {
this.setState({ language });
};
state = {
language: "en",
setLanguage: this.setLanguage
};
...
}
, Durum language
ağacının dışında tutabileceğiniz bir dil belirleyici yöntemi ile birlikte durumda depolanır.
2. Bir bağlam oluşturmak
Sonra, bunun gibi bir dil bağlamı oluşturdum:
const LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
Burada language
('en') için varsayılanları setLanguage
ve içerik sağlayıcı tarafından tüketicilere gönderilecek bir işlevi ayarlıyorum . Bunlar yalnızca varsayılanlardır ve üst öğede sağlayıcı bileşenini kullanırken değerlerini sağlayacağım App
.
3. Bir bağlam tüketicisi oluşturma
Dil değiştiricinin dili ayarlaması için, bağlam aracılığıyla dil belirleyici işlevine erişebilmesi gerekir. Şunun gibi görünebilir:
class LanguageSwitcher extends Component {
render() {
return (
<LanguageContext.Consumer>
{({ language, setLanguage }) => (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
)}
</LanguageContext.Consumer>
);
}
}
Burada dili 'jp' olarak ayarlıyorum ama bunun için dilleri ayarlamak için kendi mantığınız olabilir.
4. Tüketiciyi bir sağlayıcıya sarmak
Şimdi dil değiştirici bileşenimi a'da oluşturacağım LanguageContext.Provider
ve bağlam aracılığıyla gönderilmesi gereken değerleri daha derine aktaracağım. İşte ebeveynim App
şöyle görünüyor:
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>
);
}
}
Artık, dil değiştirici her tıklandığında bağlamı dinamik olarak günceller.
CodeSandbox Demosu