Может ли действие, которое обновляет хранилище, быть отправлено на componentDidUpdate ()? - PullRequest
0 голосов
/ 22 сентября 2018

Согласно документации React componentDidUpdate () - это место, где могут возникать побочные эффекты, но this.setState () следует избегать (или обрабатывать с осторожностью), поскольку он вызывает дополнительный рендеринг. Как насчет отправки действия, которое обновляет магазин? Применимы ли те же условия и к этому сценарию?

Я не нашел никакой документации по этому вопросу, чтоЯ обнаружил, этот вопрос на SO , но его цель для отправки действия на самом деле для получения данных с сервера.

Ответы [ 4 ]

0 голосов
/ 22 сентября 2018

В соответствии с документацией React componentDidMount () - это место, где могут возникать побочные эффекты, но следует избегать this.setState ()

В этом ничего нетдокументы, в которых это сказано.
Кроме того, в нем четко сказано:

Вы можете немедленно вызвать setState () в componentDidMount ()

Я думаю, что вы смешали это componentdidupdate

Как насчет отправки действия, которое обновляет хранилище

Это прекрасно сделать в componentDidMount, еслиОбновление магазина приведет к тому, что новый компонент prop будет введен в компонент, будет выполнен еще один вызов render.и это прекрасно!

Помните, componentDidMount вызывается только один раз в течение времени жизни компонента:

componentDidMount () вызывается сразу после монтирования компонента (вставки в дерево)

Так что нет никакого способа получить там бесконечный цикл (как предложено в комментариях).

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

Вы можете немедленно вызвать setState () в componentDidUpdate (), но учтите, чтоон должен быть заключен в условие

Редактировать

Как насчет отправки действия, обновляющего магазин

То же правило применяется здесь.отправка действия может вызвать другой рендер, если переданы новые значения проп.это может привести к бесконечному циклу.
Как уже упоминалось в документации, просто проверьте условие перед отправкой действия.

0 голосов
/ 22 сентября 2018

Я думаю, что в целом это нормально.Однако, если отправленное действие обновляет реквизиты, переданные вашему компоненту, оно может повторно визуализироваться;поэтому я бы отнесся к этому с осторожностью в этом случае (так же, как вы бы поступили с setState)

0 голосов
/ 22 сентября 2018

Если вы хотите отправить действие в componentDidMount (), а затем подумать о повторном рендеринге, я столкнулся с этой проблемой в своем приложении React Native, где я отправил действие в componentDidMount (), и оно вызывает бесполезные повторные рендеринг.Вы можете поместить свою отправку либо в

if(!isFetching){
} 

, либо в setTimeout, потому что она будет содержать отправку для запуска только один раз

setTimeout(() => {

    }, 200)
0 голосов
/ 22 сентября 2018

Это зависит от вашего действия:

  1. Если действие приводит к немедленному повторному отображению, вы, вероятно, что-то не так с архитектурой приложения.
  2. Если действие обновляет магазин, но не делаетвыполнить повторный рендеринг на этом конкретном компоненте или получить некоторую информацию через ajax и вызвать повторный рендеринг, тогда все в порядке.
...