Использование крючков
Хуки были введены в 16.8.0, поэтому для следующего кода требуется минимальная версия 16.8.0 (прокрутите вниз, чтобы увидеть пример компонентов класса). Демонстрация CodeSandbox
1. Установка родительского состояния для динамического контекста
Во-первых, чтобы иметь динамический контекст, который можно передавать потребителям, я буду использовать родительское состояние. Это гарантирует, что у меня будет единый источник истины. Например, мое родительское приложение будет выглядеть так:
const App = () => {
const [language, setLanguage] = useState("en");
const value = { language, setLanguage };
return (
...
);
};
language
Хранится в состоянии. Позже мы передадим обе функции language
и функцию установки 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