— Пересчет и сравнение VirtualDOM не бесплатное. — Не всегда можно избежать вставок нового HTML. Чтобы уменьшить количество вставок и пересчетов надо понимать как React работает. Почему? 10
2! </h1> // В JavaScript React.createElement( 'div', { className: 'cn' }, 'Content 1!', React.createElement('br'), 'Content 2!' ) React Element КАК РАБОТАЕТ РЕНДЕР В REACT 13
ReactDOM.render( React.createElement( Table , { rows: rows }), document.getElementById('#root') ); Вставка компонента на страницу КАК РАБОТАЕТ РЕНДЕР В REACT 19
ReactDOM.render() повторно вызванный на старом элементе запускает процесс сверки VirtualDOM дерева (reconcilation). Обновление страницы КАК РАБОТАЕТ РЕНДЕР В REACT 27
объект при каждом рендере const ComponentWithName = withName(Component); return < ComponentWithName />; } } HOC внутри рендера. Плохо ОПТИМИЗАЦИЯ ФИЗИЧЕСКОГО РЕРЕНДЕРА 44
родителей. Изменение родителей ведет к перерендеру. Чем меньше родителей тем лучше. — Чем ниже в дереве компонентов происходит апдейт, тем меньшую часть дерева надо перерендеривать. — Чем проще props, тем быстрее их сравнивать через === . Общие требования к передаче ОРГАНИЗАЦИЯ ДАННЫХ 61
дорого. Удобнее сразу обращаться по ключу. — Работать с вложенными коллекциями сложно – лучше их вынести на один уровень и работать по отдельности. Общие требования к обновлению ОРГАНИЗАЦИЯ ДАННЫХ 62
Этим пользуются почти все популярные библиотеки: Redux, MobX, React Intl, React Router. Внимание! Не пытайтесть использовать сами, очень кривое и поломанное API. Привязка данных ко вложенным компонентам ОРГАНИЗАЦИЯ ДАННЫХ 67
обновлении запускает селектор из mapStateToProps . — Сравнивает новые props со старыми через shallowEqual . — Изменились? Дергает this.setState() и ререндерит обернутый компонент. Упрощенный алгоритм connect() ОРГАНИЗАЦИЯ ДАННЫХ 70
const post = state.posts[ownProps.id]; const commentLink = getCommentLink(state, post.comments); return { ...post, commentLink }; })(Row); Что с вложенными коллекциями? ОРГАНИЗАЦИЯ ДАННЫХ 80
ниже. 2. Если нужны произвольные данные простого типа – собирать в селекторе. 3. Если нужны произвольные данные сложного типа – areStatePropsEqual . Что с вложенными коллекциями? ОРГАНИЗАЦИЯ ДАННЫХ 81
зависимые данные. – Две копии данных в строе. – Легко забыть обновить. – Разные версии под разные компоненты. Кеширование селекторов ОРГАНИЗАЦИЯ ДАННЫХ 87
основную – если после обновления комментария нужно обновить в пост, то в коллекцию comment имеет смысл добавить postId . — Разбиваем генерацию по уровням – comment дергает post , post может дергать что‑то еще. Правила работы с кешем ОРГАНИЗАЦИЯ ДАННЫХ 88
базовые ошибки и shouldComponentUpdate. 3. Еще тормозит? Разносим коннекты и нормализируем данные. 4. Еще торомзит? Пробуем кешировать результат селекторов. 5. Радуемся. Или плачем. Заключение 91