Реагируйте useContext из асинхронной службы с Promise - PullRequest
1 голос
/ 04 октября 2019

Я хочу создать контекст, который на самом деле исходит от некоторой асинхронной службы (например, данные сервера) ..

//the async service to bring the context data
export const fetchContextFromAsycnService = () => {
  return  new Promise(resolve => setTimeout(
      () => resolve('Hey, im in the async context and I am the correct value'), 200)
  );
} 

class App extends Component {
  render() {
    let value = 'Im not the correct value';
    fetchContextFromAsycnService().then(x => value = x as string);
    return (
      <AsyncContext.Provider value={value}>
       <SomeComponent />
      </AsyncContext.Provider>
    );
  }
}
//user the value
export const SomeComponent = ( ) => {
  return  (
    <AsyncContext.Consumer>
     {value => <div>{value}</div>}
  </AsyncContext.Consumer>)
}
render(<App />, document.getElementById('root'));

https://stackblitz.com/edit/react-ts-8zzbxa?file=index.tsx

Ожидаемое значение:: Hey, I'm in the async context and I am the correct value, но по какой-то причине я не получаю данные после того, как они были извлечены.
есть ли способ создать контекст с

1 Ответ

2 голосов
/ 04 октября 2019

, но по какой-то причине я не получаю данные после его выборки.

value не является частью состояния и не вызывает повторное-render. Таким образом, вы не видели, чтобы обновленное значение отображалось после выборки.

Чтобы сделать эту работу, просто сделайте value частью состояния, чтобы вызвать повторную визуализацию.

state = {
  value: 'Im not the correct value'
}

componentDidMount() {
  // move side-effects in here
  fetchContextFromAsycnService().then(value => this.setState({ value }));
}

render() {
  return (
    <AsyncContext.Provider value={this.state.value}>
      <SomeComponent />
    </AsyncContext.Provider>
  );
}

См. Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...