Что такое контекст в React?
- React Context — это метод передачи реквизитов от родительского к дочерним компонентам путем сохранения реквизитов в хранилище и использования этих реквизитов из хранилища дочерними компонентами без фактической передачи их вручную на каждом уровне дерева компонентов.
- В типичном приложении React данные передаются сверху вниз (от родителя к дочернему элементу) через свойства, но такое использование может быть громоздким для определенных типов свойств (например, предпочтения локали, темы пользовательского интерфейса), которые требуются для многих компонентов в приложении. Контекст предоставляет способ обмена такими значениями между компонентами без необходимости явно передавать свойство через каждый уровень дерева.
Где мы используем контекст в React?
- Всякий раз, когда требуется, чтобы хранилище сохраняло состояния или переменные и использовало их в другом месте программы, используется контекст. Как правило, когда у нас есть два или более уровня (высоты) в нашем дереве компонентов, целесообразно использовать хранилище вместо передачи реквизитов, а затем поднимать состояние, поскольку это создаст путаницу и ненужный длинный код.
- Контекст предназначен для обмена данными, которые можно считать «глобальными» для дерева компонентов React, таких как текущий аутентифицированный пользователь, тема или предпочитаемый язык.
Каковы преимущества контекста в React?
- Одна из самых важных особенностей React заключается в том, что данные текут только в одном направлении, что позволяет разработчикам предсказывать.
- Это позволяет легко отлаживать.
- Он обеспечивает возможность повторного использования.
Контекст позволяет нам передавать значение глубоко в дерево компонентов, не пропуская его явно через каждый компонент. Создайте контекст для текущей темы (с «светлым» по умолчанию).
// Context lets us pass a value deep into the component tree // without joining it through every component. const ThemeContext = React.createContext('light'); class App extends React.Component { render() { // Use a Provider to pass the current theme to the tree below. // Any component can read it, no matter how deep it is. // In this example, we're passing "dark" as the current value. return ( <ThemeContext.Provider value="dark"> <Toolbar /> </ThemeContext.Provider> ); } } // A component in the middle doesn't have to // pass the theme down explicitly anymore. function Toolbar() { return ( <div> <ThemedButton /> </div> ); } class ThemedButton extends React.Component { // Assign a contextType to read the current theme context. // React will find the closest theme Provider above and use its value. // In this example, the current theme is "dark". static contextType = ThemeContext; render() { return <Button theme={this.context} />; } } class ThemedButton extends React.Component { render() { return <Button theme={this.props.theme} />; } }
С помощью контекстного API мы можем избежать передачи реквизитов через промежуточные элементы и напрямую передать реквизиты последнему дочернему элементу или дочернему элементу, на который мы нацелились:
// Context lets us pass a value deep into the component tree // without explicitly threading it through every component. // Create a context for the current theme (with "light" as the default). const ThemeContext = React.createContext('light'); class App extends React.Component { render() { // Use a Provider to pass the current theme to the tree below. // Any component can read it, no matter how deep it is. // In this example, we're passing "dark" as the current value. return ( <ThemeContext.Provider value="dark"> <Toolbar /> </ThemeContext.Provider> ); } } // A component in the middle doesn't have to // pass the theme down explicitly anymore. function Toolbar() { return ( <div> <ThemedButton /> </div> ); }
Часть 2
import React from "react"; import ReactDOM from "react-dom"; import "./index.css"; import App from "./App"; import * as serviceWorker from "./serviceWorker"; import reducer, { initialState } from "./reducer"; import { DataLayer } from "./DataLayer"; ReactDOM.render( <React.StrictMode> <DataLayer initialState={initialState} reducer={reducer}> <App /> </DataLayer> </React.StrictMode>, document.getElementById("root") ); class ThemedButton extends React.Component { // Assign a contextType to read the current theme context. // React will find the closest theme Provider above and use its value. // In this example, the current theme is "dark". static contextType = ThemeContext; render() { return <Button theme={this.context} />; } } class ThemedButton extends React.Component { render() { return <Button theme={this.props.theme} />; } }
Каждый объект Context поставляется с компонентом Provider React, который позволяет потребляющим компонентам подписываться на изменения контекста. Все, что нам нужно сделать, это создать переменную (здесь это initialState) и присвоить ей и провайдеру начальное значение. Это начальное значение зависит от проекта, который вы делаете.
Для получения дополнительной информации я настоятельно рекомендую перейти к официальной документации и прочитать их руководства по адресу https://reactjs.org/docs/context.html.
Заключение
Следовательно, React Context API — это способ создания глобальных переменных, которые можно передавать в приложении React. Это альтернатива «сверлению реквизита» или передаче реквизита от бабушки и дедушки к родителю, потомку и так далее.
Спасибо! Я надеюсь, что вы нашли это ценным!
Рекомендации:
https://reactjs.org/docs/context.html
https://www.freecodecamp.org/news/react-context-in-5-minutes/