Что на самом деле делает useContext?

Меня очень зацепил React, но у меня возникает один большой вопрос относительно useContext. Это довольно запутанно, чтобы действительно знать, как это работает внутри.. Как будто это волшебно работает.

Итак, у меня есть в моем основном модуле это:


export const Context = React.createContext(SOMEVALUE) // why set this initial value here

const [value, setValue] = useState(SOMEVALUE) // why set this here again?

return(
<Context.Provider value = {[value, setValue]}> // why do i have to pass this  inital value here?
<App />
</Context.Provider>
)

Далее какой-то модуль внутри

import { Context } from './Main' // why import this when everything was passed?

...

const [value, setValue] = useContext(Context.offline) // what does this help?



А теперь мой вопрос:

Почему требуется импортировать Context из Main и как React подключается к состоянию, используя это?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
0
183
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

- Для чего передается значение createContext?

export const Context = React.createContext(SOMEVALUE)

Значение, переданное в React.createContext, является резервным значением, которое будет использоваться ТОЛЬКО в том случае, если Context.Consumer используется вне его Context.Provider. Это отличается от начального значения.

- Почему в useState используется одно и то же резервное значение?

const [value, setValue] = useState(SOMEVALUE)

Использование одного и того же значения в качестве начального значения и резервного значения является предпочтительным и будет меняться в зависимости от варианта использования. Эта часть фактически устанавливает начальное значение и предоставляет механизм для отслеживания и изменения этого значения.

- Почему я должен передать начальное значение Context.Provider?

<Context.Provider value = {[value, setValue]}>

Context.Provider действует как издатель в системе издатель/подписчик. Он будет транслировать эти значения, установленные здесь, любому из соответствующих Context.Consumers. Он не отслеживает значение и не предоставляет механизмов для изменения этого отслеживаемого состояния. useState сверху делает это. Context.Provider просто «транслирует» значение и функцию для изменения этого значения.

- Почему я должен импортировать Context, который я создал?

import { Context } from './Main'

const [ value, setValue ] = useContext(Context)

import { Context } импортирует объект Context, который вы создали и экспортировали из './Main'. Тот же объект Context, который вы используете для рендеринга Provider. Это используется, чтобы убедиться, что при подписке указан правильный Provider.

До хуков вы подписывались на контекст реакции через: static contextType = MyContext в классе или с помощью <MyContext.Consumer>. useContext — это просто еще один API для этого в качестве ловушки. Вы должны передать ему объект Context, чтобы он знал, на какой Context.Provider подписаться, поскольку их может быть сколько угодно.

Документация по контексту здесь

Большое спасибо! Это очень полный ответ. Но я до сих пор не знаю, как ``` import {Context } ``` делает какую-либо связь с Context в высшем классе. В противном случае я думаю, что понял.

TMvytKA9LgSVZ8Z7 30.05.2019 23:13

Без проблем. import { Context } импортирует объект Context, который вы создали и экспортировали из './Main'. Тот же Context объект, который вы используете для рендеринга Provider первого фрагмента кода. Я обновлю ответ.

Donovan Hiland 30.05.2019 23:16

Но импорт этого контекста просто создаст новый контекст. Я имею в виду, что состояние уже не то же самое? Это в основном просто скопированная функция. Я мог бы также создать контекст с тем же именем во втором файле, и это привело бы к тому же результату?

TMvytKA9LgSVZ8Z7 30.05.2019 23:19

В первом файле вы создаете контекст и используете его провайдера. Во втором файле все, что вы делаете, это используете этот объект Context в качестве ссылки. Он находит Provider из этого объекта Context и подписывается на него.

Donovan Hiland 30.05.2019 23:24

Это все объясняет. Спасибо вам всем.

TMvytKA9LgSVZ8Z7 30.05.2019 23:24

Другие вопросы по теме