Допустим, у нас есть массив из элементов (дочерние компоненты), необходимо его отрендерить при загрузке. А затем добавлять/удалять его элементы. Задача в том, чтобы сделать это максимально производительно, с точки зрения скорости рендеринга компонентов.
Собственно, начал серьёзно задумываться над этими вопросами, как раз после использования тулзов разработчика mobx, которые наглядно показывают время рендера компонентов.
При изменении массива, MobX перерисовывает абсолютно все дочерние элементы, встречая обыкновенную конструкцию вида
elements.map(data => <El data={data} />);
при том, что его elements в store "задекорированы" в @observable. Атрибуты key он не воспринимает, т.к. игнорирует
shouldComponentUpdate (исходя из документации, пытался найти какие-то обходные решения, костыли, но даже с последними крайне не густо).
Провёл перформанс-тесты для своих исходных данных:
Дочерний элемент представляет из себя material-ui checkbox, вычисляемую текстовую метку и две иконки-контрола. Ничего особенного в общем.
MobX - на 150 дочерних элементов, на создание следующего (151) уходит примерно
~145-155ms. Примерно такой же результат выдал и "голый" React, генерируя разные keys, каждый раз, что однозначно заререндерить весь список снова.
Но вот прописав банальный
shouldComponentUpdate (return false для всех былых дочерных элементов) к обычному React'y - обработка этих действ заняла всего
10-15ms.
Хотелось бы как-то решить эту проблему... либо, возможно найти достойное оправдание такому поведению.
[Update#1]: Для бОльшей наглядности я опубликовал проект, иллюстрирующий проблему (без экспериментов с computed):
Проект:
https://github.com/Naararouter/mobx-problem-001
Девелопер-тулз:
https://chrome.google.com/webstore/detail/mobx-dev...
Буду бесконечно благодарен, если удастся посмотреть и найти решение, либо направить меня по "пути истинному".
P.s.: проект - модель реальной задачи, в итоге получилось что-то похожее на банальный ToDo List. Постарался максимально абстрагироваться от контекста, сохранив структуру компонентов в реальных условиях.