Первым шагом было бы убедиться, что ссылка на переменную collection
изменяется только при изменении одной из зависимостей:
useMemo(() => {
const y = queryString.parse(search).collection;
const { collections, gqlQuery } = getCollections(dataType);
const collection = collections.find(x => x.value === y);
}, [search, dataType]);
Вторым было бы убедиться, что компонент только повторно рендерится при получении новых реквизитов:
import { memo } from 'react';
function Child() {
}
export default memo(Child);
Вы также можете использовать второй аргумент для memo
для настройки сравниваемого объекта.
function Child(props) {
}
function areEqual(prevProps, nextProps) {
/*
return true if passing nextProps to render would return
the same result as passing prevProps to render,
otherwise return false
*/
}
export default React.memo(Child, areEqual);
React.memo - Документы React.useMemo - Документы
PS: Обратите внимание, что React обычно очень быстр с повторными рендерами. Используйте их только для повышения производительности после измерения их воздействия. Есть вероятность, что его производительность на хуже, чем раньше