2016-08-22 10 views
0

Я пытаюсь написать компонент, который вызывает веб-сервис и возвращает некоторые данные асинхронно через обещание. как только это обещание будет разрешено, я хотел бы включить результаты в метод рендеринга моего компонента. В идеале я думаю, что мне хотелось бы, чтобы результаты обещания были переданы другому компоненту. IE; результатом обещания является список предметов.React, Typcript и Promises

Еще одна вещь - я пишу этот компонент React с помощью TypScript.

В настоящее время у меня есть следующий код:

componentWillMount() { 
    let fooProps = listGetter.returnListData().then((response) => { 
     return response; 
    }); 
} 

public render(): JSX.Element { 
    <div> 
     <Foo ElementProperties={this.fooProps} /> 
    </div> 
} 

Однако этот код ошибка вне и показывает «не могут присвоить нулевое значение свойства».

Что я делаю неправильно? Каков наилучший способ справиться с обещаниями и разрешить их в компонентах REACT?

Спасибо!

+0

Проверьте, если ваш возвращаемый список пуст/нуля в вашем затем обратном вызове. Кроме того, ваши fooProps являются блочными областями, поэтому ваша функция рендеринга не может ее увидеть. – Jecoms

ответ

1

Вы должны использовать the state данного компонента.
Изменение состояния приводит к повторному рендерингу компонента, подобно тому, как при изменении компонента свойства дочернего объекта происходит повторное отображение ребёнка.

Что-то вроде:

componentWillMount() { 
    listGetter.returnListData().then((response) => { 
     this.setState({ 
      fooProps: response.fooProps 
     }); 
    }); 
} 

public render(): JSX.Element { 
    <div> 
     <Foo ElementProperties={ this.state.fooProps } /> 
    </div> 
} 
+0

Большое спасибо Ницан. Это именно то, что я искал. Я не проверял значение null и до того, как ответ был возвращен, метод render начал выполнять передачу null в Foo-управление и рендеринг нулевой ссылки, кроме. Я переработал его и связал состояние с функцией, и теперь она работает хорошо. – MrDoNotBreak

0

Обещания никогда не возвращают их значения, они только возвращают Thenable так что вы можете приковать их. Возвращаемое значение вы ищете будет в первом аргументе функции передается then

componentWillMount() { 
    // bind the function to `this` so even if you don't use an 
    // anonymous arrow function this call will work in the right context 
    let updateComponent = this.updateComponent.bind(this); 
    listGetter.returnListData().then((res) => { 
     updateComponent(res); 
    }) 
} 

updateComponent(res) { 
    this.setState({fooProps: res.fooProps}) 
} 
+1

Здесь нет необходимости использовать 'bind', поскольку функция стрелки сохраняет область' this'. –

+0

@NitzanTomer Я только что добавил комментарий, конечно, он не нужен, но хорошо привыкнуть, особенно если вы используете разные синтаксисы функций. Возможно, я даже рекомендую 'this.updateComponent = this.updateComponent.bind (this)' в конструкторе. – Gant

+1

Это избыточно и создает новую функцию без причины –

Смежные вопросы