2016-07-04 1 views
6

Реагирующая документация заявляет, что запрос ajax должен быть инициирован из componentDidMount события жизненного цикла (см. react docs).Почему запрос ajax должен выполняться в компонентах Componentid в компонентах React?

Почему это событие?

В большинстве случаев, при загрузке данных с помощью Ajax, я хочу, чтобы отобразить какое-то полоса загрузки, например:

componentDidMount() { 
    this.setState({isLoading: true}); 
    fetch(...) 
     .then(...) 
     .then(() => this.setState({isLoading: false}) 
} 

, но это срабатывает render метод 3 раза (начальная рендер мгновенным следует настройки isLoading = true, а затем по isLoading = false

Что плохого об отправке Ajax запрос от componentWillMount события?

+0

Возможный дубликат [Почему рекомендации React рекомендуют делать AJAX в компонентеDidMount, а не componentWillMount?] (Http://stackoverflow.com/questions/27139366/why-do-the-react-docs-recommend-doing-ajax -in-componentdidmount-not-componentwi) – mattias

ответ

3

Ну, isLoading: true может быть частью исходного состояния, нет необходимости установить его после того, как компонент сделал крепление => только 2 визуализаций, а не 3.

Согласно https://github.com/reactjs/react-redux/issues/210, следствием вызова render только один раз из componentWillMount означает, что если setState будет асинхронно вызывается после render, он не будет иметь никакого эффекта (если я правильно понимаю комментарии).

Не уверен, что существует вероятность того, что обратный вызов с setState может быть выполнен до render, и, таким образом, экран загрузки не будет виден, только результаты, поэтому иногда он «работает» (скорее всего, в DEV), но на самом деле это будет состояние гонки очень трудно отлаживать ...

Смотрите также https://facebook.github.io/react/tips/initial-ajax.html

+0

проблема была исправлена, поэтому setState, вызываемый из componentWillMount, вступит в силу перед рендерингом. в действительных документах все еще нет объяснений, почему вызовы ajax должны выполняться в компоненте ComponentDumMount – Liero

+0

, вы не вызываете 'setState' напрямую из компонента componentWillMount или componentDidMount, а из нового стека асинхронов. Я понятия не имею, как точно реагировать, чтобы поддерживать ссылку на «это» с помощью прослушивателей живых событий из разных методов. если использование недокументированных функций недостаточно для вас, и вы хотите немного волноваться, что это может сработать, а может быть и в будущих версиях, тогда не стесняйтесь, я не знаю, сломается или нет. – Aprillion

0

Пойнт пусть ваш реагировать компонент визуализации с начальным состоянием, так что вы увидите полосу загрузки (загрузки: правда).

Вы можете перемещать строку: this.setState ({isLoading: true}) в компонентеWillMount(). Потому что состояние установки в компонентеWillMount не вызовет повторителя вашего компонента. Ваш метод визуализации получит обновленный компонент.

+0

Но мне нужно очень веские причины split 'this.setState ({isLoading: true})' и ajax вызов в два события жизненного цикла. Я до сих пор не знаю, почему ajax-вызов должен выполняться в компонентеDidMount, а не в компонентеWillMount – Liero

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