как предотвратить рендеринг дочернего компонента при изменении состояния / реквизита родительского компонента? - PullRequest
0 голосов
/ 17 декабря 2018

прямо сейчас у меня есть такой компонент дерева

<UserOrderApproval>
  <Table>
    <TableRow> 
      <ComponentList />
    </ChildrenProps1>
  </Parent>
</UserOrderApproval>    

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

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

Большое спасибо

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

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

https://reactjs.org/docs/react-component.html#shouldcomponentupdate

https://reactjs.org/docs/react-api.html#reactpurecomponent

0 голосов
/ 17 декабря 2018

Как сказал KuchBhi, вам нужно будет использовать метод жизненного цикла shouldComponentUpdate.

shouldComponentUpdate вызывается каждый раз, когда новые реквизиты или состояние передаются компоненту и по умолчанию возвращает true (можеттолько верните true для обновленных реквизитов, не уверен на 100%).Метод принимает два параметра: nextProps и nextState.Затем вы можете сравнить их с this.props и this.state, чтобы решить, следует ли вам обновить.

Стандартная / типичная реализация этого метода - что-то вроде этого (псевдо):

shouldComponentUpdate(nextProps, nextState) {
  //Really it's a deeper equality check, not just the props/state object
  return this.props !== nextProps || this.state !== nextState;
}

Что вы можете сделать в качестве альтернативы, это построить немного больше в случаях, когда возвращается false.Вот пример из одного из моих проектов, где я хочу рендерить только тогда, когда два конкретных реквизита различны:

shouldComponentUpdate(nextProps) {
  const minUpdated = this.props.min !== nextProps.min;
  const maxUpdated = this.props.max !== nextProps.max;
  return minUpdated || maxUpdated;
}

Компонент также имеет реквизиты, такие как масштаб, выравнивание, ширина и т. Д., Но я нене хочу обновлять, когда я получаю их как новые реквизиты, поэтому я не проверяю, не равны ли они.

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

edit: Как сказали varoons, этоВероятно, это отличный сценарий для вас, чтобы использовать новый контекстный API, и я настоятельно рекомендую изучить его, но также полезно знать о методах жизненного цикла компонентов.

0 голосов
/ 17 декабря 2018

Это хороший сценарий для использования контекстного API React, так как это похоже на случай углубленного изучения - вы передаете данные компонентам, которые их не используют.Вы можете сделать UserOrderApproval (предполагая, что это родитель, связанный с глобальным состоянием / редукцией) провайдером контекста, а ComponentList - потребителем.Таким образом, только компоненты, обрабатывающие / использующие данные, будут перерисованы.

https://reactjs.org/docs/context.html

https://scotch.io/tutorials/get-to-know-reacts-new-context-api

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