За допомогою гачків
Хуки були введені в 16.8.0, тому наступний код вимагає мінімальної версії 16.8.0 (прокрутіть униз для прикладу компонентів класу). Демонстрація CodeSandbox
1. Встановлення батьківського стану для динамічного контексту
По-перше, для того, щоб мати динамічний контекст, який можна передавати споживачам, я буду використовувати батьківський стан. Це гарантує, що у мене є одне джерело істини. Наприклад, моя батьківська програма буде виглядати так:
const App = () => {
const [language, setLanguage] = useState("en");
const value = { language, setLanguage };
return (
...
);
};
language
Зберігається в стані. Пізніше ми передамо обидва language
і функцію setter setLanguage
через контекст.
2. Створення контексту
Далі я створив такий мовний контекст:
const LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
Тут я встановлюю значення за замовчуванням для language
('en') та setLanguage
функцію, яку постачальник контексту надсилатиме споживачеві. Це лише за замовчуванням, і я надаю їх значення при використанні компонента постачальника в батьківському App
.
Примітка: LanguageContext
залишається незмінним, неважливо ви
3. Створення контексту споживача
Для того, щоб перемикач мови встановлював мову, він повинен мати доступ до функції встановлення мови через контекст. Це може виглядати приблизно так:
const LanguageSwitcher = () => {
const { language, setLanguage } = useContext(LanguageContext);
return (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
);
};
Тут я просто встановлюю мову на "jp", але у вас може бути своя логіка для встановлення мов для цього.
4. Обгортання споживача у постачальника
Тепер я відтворюю компонент мого перемикача мови в a LanguageContext.Provider
і передаю значення, які повинні бути надіслані через контекст на будь-який рівень глибше. Ось як App
виглядають мої батьки :
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>
);
};
Тепер при кожному натисканні на перемикач мови він динамічно оновлює контекст.
Демонстрація CodeSandbox
Використання компонентів класу
Останній контекстний API був представлений в React 16.3, який забезпечує чудовий спосіб створення динамічного контексту. Наступний код вимагає мінімальної версії 16.3.0. Демонстрація CodeSandbox
1. Встановлення батьківського стану для динамічного контексту
По-перше, для того, щоб мати динамічний контекст, який можна передавати споживачам, я буду використовувати батьківський стан. Це гарантує, що у мене є одне джерело істини. Наприклад, моя батьківська програма буде виглядати так:
class App extends Component {
setLanguage = language => {
this.setState({ language });
};
state = {
language: "en",
setLanguage: this.setLanguage
};
...
}
Файл language
зберігається у стані разом із методом встановлення мови, який ви можете зберігати поза деревом стану.
2. Створення контексту
Далі я створив такий мовний контекст:
const LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
Тут я встановлюю значення за замовчуванням для language
('en') та setLanguage
функцію, яку постачальник контексту надсилатиме споживачеві. Це лише за замовчуванням, і я надаю їх значення при використанні компонента постачальника в батьківському App
.
3. Створення контексту споживача
Для того, щоб перемикач мови встановлював мову, він повинен мати доступ до функції встановлення мови через контекст. Це може виглядати приблизно так:
class LanguageSwitcher extends Component {
render() {
return (
<LanguageContext.Consumer>
{({ language, setLanguage }) => (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
)}
</LanguageContext.Consumer>
);
}
}
Тут я просто встановлюю мову на "jp", але у вас може бути своя логіка для встановлення мов для цього.
4. Обгортання споживача у постачальника
Тепер я відтворюю компонент мого перемикача мови в a LanguageContext.Provider
і передаю значення, які повинні бути надіслані через контекст на будь-який рівень глибше. Ось як App
виглядають мої батьки :
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>
);
}
}
Тепер при кожному натисканні на перемикач мови він динамічно оновлює контекст.
Демонстрація CodeSandbox