Spring Cloud Feign + Sleuth + Zipkin - требуется оригинальный запрос

Все в порядке. Я понимаю все, кроме функции в компоненте SampleConsumer.

Вы установили SampleConsumer, чтобы указать на исходный Consumer вывод createContext(). Он будет функционировать точно так же, как пример ThemeContext.Consumer в документах.

Функция

в SampleConsumer использует образец в качестве параметра. Я тестировал и sample.state.value отображает «значение по умолчанию», и это значение состояния, объявленного в компоненте SampleProvider.

Вы завернули исходный вывод Provider в createContext() с вашим компонентом SampleProvider. Как вы это делали, вы устанавливаете значение контекста Provider в (изначально):

{
  state: {
    value: 'default value'
  },
  actions: {
    setValue: (value) => { this.setState({value}) }
  }
}

Значение этого, когда вы вызываете SampleConsumer, который является дочерним элементом SampleProvider, аргумент в «дочернем как функция» будет передан это значение. Другими словами, это отображает строковое представление объекта в приведенном выше фрагменте:

<SampleConsumer>
  { (value) => <div>{value.toString()}</div> }
</SampleConsumer>

SampleProvider передает состояние как реквизит компонента поставщика. Я понимаю, что провайдер может использовать это состояние.

Правильно - вы установили Provider 's value prop равным объекту, содержащему состояние SampleProvider.

Но как параметр в SampleConsumer понимает состояние в компоненте SampleProvider?

Это именно то, что выполняет контекстный API. SampleConsumer имеет доступ к Provider 's value prop, без необходимости пропускать опору через все дочерние элементы между ними. Обратите внимание, что у вашего кода здесь нет ничего промежуточного, так что это немного тривиально;

Я никогда не передавал это состояние в качестве реквизита для компонента SampleProvider .. (я так понял. Возможно, это неправильно)

Вы передали состояние SampleProvider в качестве опоры для Provider. Provider, в свою очередь, передал свою опору до SampleConsumer.

Я думаю, что ядро ​​недоразумения здесь - ваше использование (или именование) SampleProvider. Я не уверен, что вы пытаетесь сделать с этим состоянием, но это уже не «Провайдер», и это путает. Это не похоже на ваш SampleConsumer, который по-прежнему по умолчанию Consumer, просто переименован.

2
задан ilovespring 18 January 2019 в 23:46
поделиться

1 ответ

Трудно сказать без дополнительной информации. Но это может быть связано с несовместимыми библиотеками . Можете ли вы опубликовать свои зависимости?

В случае, если вы используете более старую версию okhttpclient с последней весенним облаком: гринвич, это может вызвать эту проблему.

Я использую Greenwich.RELEASE с okhttpclient: 10.2.0 , который работает без проблем

0
ответ дан Michal Říčan 18 January 2019 в 23:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: