Comments 11
PureComponent или "чистый компонент" подразумевает, что state
внутри не будет, что весьма логично. "Чистый" — значит "без состояния".
Примеры несколько неудачны.
Простите но вы абсолютно не правы. Чистый компонент — это когда render зависит только от state и props. То о чем вы говорите, называется — stateless компонент.
Простите, а от чего кроме props
и state
может зависеть результат работы render
?
Если вы про context
, то юзать его можно и в PureComponent, и в Component.
Честно говоря, от чего угодно:
Проблема в том, что команда реакта в свое время позволила себе обозвать технику проверки аргументов в процессе, называемом ими
Но, первое, о чем навевает мысли слово
В общем, отсюда и вся путаница.
const Foo = props => Math.random()
.Проблема в том, что команда реакта в свое время позволила себе обозвать технику проверки аргументов в процессе, называемом ими
reconciliation
, как pure rendering
. Они даже дальше пошли — придумали PureComponent
. Но, первое, о чем навевает мысли слово
pure
— это чистые функции ФП. По этой аналогии оно и придумано. Пересечение, конечно, есть, но до тех пор, пока в языке отсутствуют декларативные эффекты, те же самые elm/purescript
не дадут вам безнаказанно встроить в функцию генератор случайных чисел. Вам придется декларативно указать это в типе, и вот тогда функция продолжить быть чистой, только с эффектом в возвращаемом значении.В общем, отсюда и вся путаница.
Стоило упомянуть проблемы со сменой контекста при использовании pure-rendering.
Спасибо за полезное замечание.
shouldComponentUpdate, следовательно и pureComponent, игнорирует изменения в context, проверяя лишь изменения в state и props.На самом деле, это тоже не совсем так. Контекст приходит третьим аргументом в shouldComponentUpdate, но тогда и только тогда, когда он явно указан через contextTypes. Проблема в том, что не все компоненты это делают (и это разумно), и, например, промежуточный PureComponent, который рендерит детей, зависящих от контекста (и смены значений в нем), если в нем не объявлены contextTypes, просто проигнорирует апдейт.
Существует вполне себе решение (и вроде так сделали в react-router) — хранить в контексте неизменяемую ссылку на инстанс эмиттера, и общаться событиями изменения через него. В детях подписываемся и обновляем стейт, можно даже в HOC обернуть.
Как-то мимо обошел изменения в React, просто обновился для галочки. Спасибо за статью!
Sign up to leave a comment.
Разбор: как и зачем применять PureComponent в React