Все в порядке. Я понимаю все, кроме функции в компоненте SampleConsumer.
blockquote>Вы установили
SampleConsumer
, чтобы указать на исходныйConsumer
выводcreateContext()
. Он будет функционировать точно так же, как примерThemeContext.Consumer
в документах.Функцияв SampleConsumer использует образец в качестве параметра. Я тестировал и sample.state.value отображает «значение по умолчанию», и это значение состояния, объявленного в компоненте SampleProvider.
blockquote>Вы завернули исходный вывод
Provider
вcreateContext()
с вашим компонентомSampleProvider
. Как вы это делали, вы устанавливаете значение контекстаProvider
в (изначально):
{ state: { value: 'default value' }, actions: { setValue: (value) => { this.setState({value}) } } }
Значение этого, когда вы вызываете
SampleConsumer
, который является дочерним элементомSampleProvider
, аргумент в «дочернем как функция» будет передан это значение. Другими словами, это отображает строковое представление объекта в приведенном выше фрагменте:
<SampleConsumer> { (value) => <div>{value.toString()}</div> } </SampleConsumer>
SampleProvider передает состояние как реквизит компонента поставщика. Я понимаю, что провайдер может использовать это состояние.
blockquote>Правильно - вы установили
Provider
'svalue
prop равным объекту, содержащему состояниеSampleProvider
.Но как параметр в SampleConsumer понимает состояние в компоненте SampleProvider?
blockquote>Это именно то, что выполняет контекстный API.
SampleConsumer
имеет доступ кProvider
'svalue
prop, без необходимости пропускать опору через все дочерние элементы между ними. Обратите внимание, что у вашего кода здесь нет ничего промежуточного, так что это немного тривиально;
Я никогда не передавал это состояние в качестве реквизита для компонента SampleProvider .. (я так понял. Возможно, это неправильно)
blockquote>Вы передали состояние
SampleProvider
в качестве опоры дляProvider
.Provider
, в свою очередь, передал свою опору доSampleConsumer
.Я думаю, что ядро недоразумения здесь - ваше использование (или именование)
SampleProvider
. Я не уверен, что вы пытаетесь сделать с этим состоянием, но это уже не «Провайдер», и это путает. Это не похоже на вашSampleConsumer
, который по-прежнему по умолчаниюConsumer
, просто переименован.
Трудно сказать без дополнительной информации. Но это может быть связано с несовместимыми библиотеками . Можете ли вы опубликовать свои зависимости?
В случае, если вы используете более старую версию okhttpclient с последней весенним облаком: гринвич, это может вызвать эту проблему.
Я использую Greenwich.RELEASE с okhttpclient: 10.2.0 , который работает без проблем