Реквизит против контекста
Привет, мир!
При разработке приложения нам может понадобиться передавать данные из одного компонента в другой. Иногда сценарий может быть немного сложным, когда нам нужно передать данные от n-го дочернего элемента компонента X до m-го дочернего элемента компонента Y.
Использование «Реквизита» — один из способов сделать это. Однако это вложенный компонент, поэтому нам придется связать несколько реквизитов, пока мы не достигнем желаемого компонента.
Давайте посмотрим пример:
На приведенной выше диаграмме давайте рассмотрим, хотим ли мы передать значение переменной val
из компонента X
в компонент c
, который является третьим дочерним элементом компонента Y
. Если мы передаем через пропсы, то это будет так: мы будем передавать val от X
до Y
, затем от Y
до a
, затем от a
до b
и, наконец, от b
до c
. Это такая длинная цепочка реквизитов от X
до c
. Но что, если у нас есть 100 дочерних элементов для компонента Y, и мы должны передать значение 100-му компоненту из Y. Мы не можем написать 100 реквизитов в цепочке. Для этого сценария мы можем использовать API реакции Context
.
Контекст — это встроенный API в React, представленный в версии 16.3. Контекст позволяет нам передавать значение от одного компонента к другому напрямую, минуя дерево компонентов. Контекст хранит значения отдельно, поэтому данные доступны во всем приложении.
Вот как Контекст будет работать логически:
Как это реализовать?
Создать контекст очень просто. Мы можем создать такой контекст:
import { createContext } from "react"; export const NameOfContext = createContext('initial value')
Нам нужно будет заключить App.js
в тег <NameofContext.provider>
и предоставить значение контекста и функцию для изменения значения контекста в качестве поддержки значения. Мы делаем это в App.js, чтобы значение контекста было доступно во всем приложении, то есть во всех дочерних элементах компонента App. Ниже будет его реализация.
import {NameOfContext} from './path/to/context' export default function App() { return ( // Here the "val" is the context value and "setVal" is the function used to change the context value <ThemeContext.Provider value={{val, setVal}}> <div className="main-container"> . . . . </div> </ThemeContext.Provider>
Если мы хотим установить контекст, мы можем сделать это, используя хук useContext
. Ниже будет его реализация.
import {NameOfContext} from './path/to/context' const Component = () => { // destructing the value and function with useContext hook const {val, setVal} = useContext(NameOfContext) return ( <div> <!-- Assuming the val is 0 and on clicking the button, we are incrementing by 1 --> <button onClick={() => setVal(val+1)}>{val}</button> </div> ) } export default Component
Вариант использования
Я использовал Context в одном из вариантов использования на своем веб-сайте. Я реализовал темную тему для своего веб-сайта, где тема должна переключаться между темной и светлой при нажатии кнопки.
Для реализации этого я создал ThemeContext
, в котором хранится значение темы, будь то 'dark'
или 'light'
. Я буду устанавливать значение контекста в компоненте, который содержит кнопку-переключатель. Для остальных компонентов я получу значение контекста и применю классы CSS на основе значения контекста.
Ниже приведены несколько реализаций на моем сайте:
Я создал файл ThemeContext.js
, в котором я создал и инициализировал контекст с помощью 'light'
.
В файле App.js
я заключил вещи внутри тега <ThemeContext.Provider>
.
В файле header.jsx
, который содержит кнопку-переключатель, я использую theme
для установки стилей тем и setTheme
для обновления контекста при нажатии кнопки.
В файле footer.jsx
я просто использую значение theme
для установки классов CSS в соответствии с темой.
Как и для компонента нижнего колонтитула, для остальных компонентов я использовал значение theme
и соответствующим образом установил классы CSS.
Вы можете посмотреть, как я это реализовал в репозитории ниже:
Вот как это работает на реальном сайте:
За и против
Плюсы
Ниже приведены несколько преимуществ контекстов:
- Избегает длинных цепочек реквизита
- Просто и легко реализовать
Минусы
Контекст — замечательная функция, облегчающая нашу работу. Но у него также есть некоторые минусы, и ниже приведены некоторые из них:
- Отладка затруднена.
- Может создать ненужную сложность при чрезмерном использовании
Это все о контекстах React. Надеюсь, это полезно. Ждем ваших комментариев и отзывов. Спасибо!
Первоначально опубликовано на https://sriram23.hashnode.dev.