Меня очень зацепил 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 подключается к состоянию, используя это?





- Для чего передается значение 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, который вы создали и экспортировали из './Main'. Тот же Context объект, который вы используете для рендеринга Provider первого фрагмента кода. Я обновлю ответ.
Но импорт этого контекста просто создаст новый контекст. Я имею в виду, что состояние уже не то же самое? Это в основном просто скопированная функция. Я мог бы также создать контекст с тем же именем во втором файле, и это привело бы к тому же результату?
В первом файле вы создаете контекст и используете его провайдера. Во втором файле все, что вы делаете, это используете этот объект Context в качестве ссылки. Он находит Provider из этого объекта Context и подписывается на него.
Это все объясняет. Спасибо вам всем.
Большое спасибо! Это очень полный ответ. Но я до сих пор не знаю, как ``` import {Context } ``` делает какую-либо связь с Context в высшем классе. В противном случае я думаю, что понял.