2016-11-07 3 views
0

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

ответ

3

Именно поэтому React не делает этого для вас. Он должен будет проверить все свойства и их детей (и потомков). Это может быть много работы.

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

Без React-Redux вам необходимо реализовать shouldComponentUpdate, но если вы используете неизменяемые данные, вы можете реализовать общую функцию, чтобы выполнить мелкое сравнение и использовать ее во всех ваших компонентах. Если вы не используете неизменяемые данные повсюду, вам нужно либо использовать глубокое сравнение, либо оптимизировать, реализовать shouldComponentUpdate по отдельности для конкретных проверок.

Это большая причина, по которой используется React-Redux.

+0

Да Я использую «React-Redux» и неизменные объекты, а также компонент «Консоль контейнера» (tabbar view) ко всем свойствам, а затем у меня есть компонент всплывающего окна, который не имеет состояния, поэтому я должен снова подключить его к необходимым свойствам из хранилища ? Потому что я думаю, что только компоненты контейнера должны быть подключены. – Tino

+1

Вы можете подключить что угодно, даже если 'mapStateToProps' и' mapDispatchToProps' возвращают пустые объекты (реализует нечетный 'mustComponentUpdate' для вас). По существу, HOC, создаваемый 'connect', становится контейнером вокруг текущего компонента. В качестве альтернативы вы можете написать 'shouldComponentUpdate', или вы можете позволить React отсортировать его (если это небольшой компонент, нет необходимости беспокоиться об этом). – DDS

3

Вот как работает Реакт. Если родительский компонент повторно отображает, все его дочерние элементы будут повторно отображены, а затем React будет различать виртуальный вывод DOM и посмотреть, что на самом деле нужно обновить в реальном интерфейсе. Этот процесс происходит, даже если реквизит, передаваемый дочернему компоненту, не изменился. И да, shouldComponentUpdate - правильное решение здесь, но это не может быть использовано с функциональными компонентами, насколько я знаю, поскольку они не имеют методов жизненного цикла.

Если вы хотите предотвратить повторный рендеринг, вам, вероятно, придется преобразовать эти функциональные компоненты в компоненты класса и либо реализовать shouldComponentupdate самостоятельно, либо продлить их до React.PureComponent, если вы используете React 15.3.

+0

Компонент расширен от React.PureCompont не будет повторно отображаться, если реквизит не изменится? – Tino

+1

Ранее React предоставил 'PureRenderMixin' для продолжения создания компонента 'React.createClass'. Поскольку они устарели, они добавили новый базовый класс 'PureComponent', который действует так, как если бы он имел проверку на равенство по методу неполного равенства' shouldComponentUpdate'. – markerikson

+0

Получил это, thx много, просто оставит это для других: 'Если вы определите, что какой-то конкретный компонент медленный после профилирования, вы можете его изменить, чтобы наследовать от React.PureComponent, который реализует shouldComponentUpdate() с неглубокой поддержкой и сравнением состояний .' – Tino

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