После того как меняется widgets происходит смена ссылки для handleTopologySelect, следовательно вызвается useEffect (memoize-one не может сохранять сами обработчики в кэше) и так далее как этого можно избежать?
const getMemoWidgets = memoizeOne(widgets => widgets, isDeepEqual);
const handleTopologySelect = useCallback((selectedNode) => {
const newWidgets = widgets.map((widget) => {
if (widget.isTopology) {
const { props: widgetProps } = widget;
return {
...widget,
props: {
...widgetProps,
nodes: widgetProps.nodes.map((node) => {
if (node.id === selectedNode.id) {
return { ...node, isSelected: !selectedNode.isSelected };
}
return node;
})
}
};
}
return widget;
});
setWidgets(getMemoWidgets(newWidgets));
}, [widgets]);
useEffect(() => {
const newWidgets = widgets
.map((widget) => {
if (widget.isTopology) {
return {
...widget,
props: { ...props[widget.id], onSelect: handleTopologySelect }
};
}
return {
...widget,
props: { ...props[widget.id] }
};
});
setWidgets(getMemoWidgets(newWidgets));
}, [handleTopologySelect, props, widgets]);