Я новичок в React, Redux и ImmutableJS и столкнулся с некоторыми проблемами производительности.
У меня есть большая древовидная структура данных, которую я сейчас храню в виде плоского списка в этой структуре:
new Map({
1: new Node({
id: 1,
text: 'Root',
children: [2,3]
}),
2: new Node({
id: 2,
text: 'Child 1',
children: [4]
}),
3: new Node({
id: 3,
text: 'Child 2',
children: []
}),
4: new Node({
id: 4,
text: 'Child of child 1',
children: []
})
});
При структурировании его как плоского списка упрощается обновление узлов, я обнаруживаю, что взаимодействие становится вялым по мере роста дерева. Взаимодействие включает в себя возможность выбора одного или нескольких узлов, переключения видимости их дочерних узлов, обновления текста и т.д. Похоже, что ключевой причиной вялого интерфейса является то, что все дерево перерисовывается для каждого взаимодействия.
Я хочу использовать shouldComponentUpdate
, чтобы при обновлении node 3 узлы 2 и 4 не обновлялись. Это было бы легко, если бы данные были сохранены как дерево (я мог бы просто проверить, есть ли this.props !== nextProps
), но поскольку данные хранятся в плоском списке, проверка будет значительно сложнее.
Как мне хранить данные и использовать shouldComponentUpdate
(или другие методы) для поддержки гладкого интерфейса с сотнями или тысячами узлов дерева?
Edit
Я подключил хранилище на верхнем уровне, а затем должен передать весь хранилище до подкомпонентов.
Моя структура:
<NodeTree>
<NodeBranch>
<Node>{{text}}</Node>
<NodeTree>...</NodeTree>
</NodeBranch>
<NodeBranch>
<Node>{{text}}</Node>
<NodeTree>...</NodeTree>
</NodeBranch>
...
</NodeTree>
<Node>
может выполнить простую проверку с помощью shouldComponentUpdate
, чтобы узнать, изменился ли заголовок, но у меня нет аналогичного решения для использования в <NodeTree>
или <NodeBranch>
, учитывая рекурсивный характер дерева.
Похоже, что лучшим решением (спасибо @Dan Abramov) было бы подключение каждого <NodeBranch>
, а просто подключение на верхнем уровне. Я проведу это сегодня вечером.