Я использую приложение для Android, используя реакцию-native и redux. Мой контейнерный компонент часто обновляется, но реквизит, который я передаю дочернему компоненту без гражданства, не меняется, но он все еще повторно отображается. Как я могу предотвратить эту повторную визуализацию? Я знаю, что могу использовать shouldComponentUpdate
, но тогда мне нужно проверить там все свойства.Почему компонент без гражданства перерисовывается, когда реквизит не меняется?
ответ
Именно поэтому React не делает этого для вас. Он должен будет проверить все свойства и их детей (и потомков). Это может быть много работы.
Если вы используете React-Redux, просто укажите, какие компоненты ему нужны, и он не должен перерегиментировать, потому что Redux делает разные предположения о ваших данных. В частности, предполагается, что вы используете неизменяемые объекты повсюду, а это значит, что не нужно проверять детей (или потомков).
Без React-Redux вам необходимо реализовать shouldComponentUpdate
, но если вы используете неизменяемые данные, вы можете реализовать общую функцию, чтобы выполнить мелкое сравнение и использовать ее во всех ваших компонентах. Если вы не используете неизменяемые данные повсюду, вам нужно либо использовать глубокое сравнение, либо оптимизировать, реализовать shouldComponentUpdate
по отдельности для конкретных проверок.
Это большая причина, по которой используется React-Redux.
Вот как работает Реакт. Если родительский компонент повторно отображает, все его дочерние элементы будут повторно отображены, а затем React будет различать виртуальный вывод DOM и посмотреть, что на самом деле нужно обновить в реальном интерфейсе. Этот процесс происходит, даже если реквизит, передаваемый дочернему компоненту, не изменился. И да, shouldComponentUpdate
- правильное решение здесь, но это не может быть использовано с функциональными компонентами, насколько я знаю, поскольку они не имеют методов жизненного цикла.
Если вы хотите предотвратить повторный рендеринг, вам, вероятно, придется преобразовать эти функциональные компоненты в компоненты класса и либо реализовать shouldComponentupdate
самостоятельно, либо продлить их до React.PureComponent
, если вы используете React 15.3.
Компонент расширен от React.PureCompont не будет повторно отображаться, если реквизит не изменится? – Tino
Ранее React предоставил 'PureRenderMixin' для продолжения создания компонента 'React.createClass'. Поскольку они устарели, они добавили новый базовый класс 'PureComponent', который действует так, как если бы он имел проверку на равенство по методу неполного равенства' shouldComponentUpdate'. – markerikson
Получил это, thx много, просто оставит это для других: 'Если вы определите, что какой-то конкретный компонент медленный после профилирования, вы можете его изменить, чтобы наследовать от React.PureComponent, который реализует shouldComponentUpdate() с неглубокой поддержкой и сравнением состояний .' – Tino
- 1. почему питание память без гражданства компонент
- 2. Почему мой компонент не перерисовывается в реакции
- 3. Реагировать без гражданства компонент не работают
- 4. Компонент Child Reactjs не перерисовывается
- 5. Когда использовать состояние и когда реквизит?
- 6. Компонент обновляется, когда предыдущий реквизит равно следующего реквизит
- 7. Почему пользователь не перерисовывается?
- 8. Компонент React не получает реквизит
- 9. React - Как экспортировать чистый компонент без гражданства
- 10. React ES6 импортирует компонент без гражданства
- 11. Drools: Почему сеансы без гражданства?
- 12. Почему компонент Om Next не перерисовывается при изменении состояния?
- 13. Java Swing компонент не перерисовывается автоматически
- 14. компонент не перерисовывается при изменении базовой модели
- 15. Компонент React не перерисовывается при изменении состояния
- 16. @PostConstruct вызвал вызов Stateful EJB, но не без гражданства Почему?
- 17. clickHandler в компоненте без гражданства?
- 18. почему без гражданства и сессионный компонент ведет себя не как ожидалось
- 19. Почему не перерисовывается ENTIRE JPanel?
- 20. Действия являются лицами без гражданства, но являются контроллерами без гражданства?
- 21. Контекст в компоненте «без гражданства»?
- 22. Реакция: почему реквизит не заморожен?
- 23. Простейшее приложение Redux-React в ES5: почему реквизит не передается?
- 24. Почему возможно иногда привязывать ref к функции без гражданства?
- 25. Почему мой дочерний компонент теряет реквизит после вызова API-запроса
- 26. Без гражданства с EJB
- 27. Добавить реквизит и переход, когда компонент представляет собой вид фрагмента
- 28. Преимущества программирования без гражданства?
- 29. выйти без гражданства приложение
- 30. без гражданства аннотаций не может быть найден
Да Я использую «React-Redux» и неизменные объекты, а также компонент «Консоль контейнера» (tabbar view) ко всем свойствам, а затем у меня есть компонент всплывающего окна, который не имеет состояния, поэтому я должен снова подключить его к необходимым свойствам из хранилища ? Потому что я думаю, что только компоненты контейнера должны быть подключены. – Tino
Вы можете подключить что угодно, даже если 'mapStateToProps' и' mapDispatchToProps' возвращают пустые объекты (реализует нечетный 'mustComponentUpdate' для вас). По существу, HOC, создаваемый 'connect', становится контейнером вокруг текущего компонента. В качестве альтернативы вы можете написать 'shouldComponentUpdate', или вы можете позволить React отсортировать его (если это небольшой компонент, нет необходимости беспокоиться об этом). – DDS