так что я закончил тем, что добавил этот маленький самородок после того, как преследовал слишком много кроликов ..
const cache = {};
const AccordionSection = memo(({ children, sectionSlug, onClick, isOpen }) => {
if (cache[sectionSlug]) {
console.log({
children: children === cache[sectionSlug].children,
sectionSlug: sectionSlug === cache[sectionSlug].sectionSlug,
onClick: onClick === cache[sectionSlug].onClick,
isOpen: isOpen === cache[sectionSlug].isOpen
});
}
cache[sectionSlug] = { children, sectionSlug, onClick, isOpen };
Это показало, что менялось onClick
.Что тогда кажется очевидным, так как компонент Accordion выполняет рендеринг и создание нового onClick
.
, оборачивая его onClick
созданием с useCallback
, исправляя проблему.
const onClick = useCallback(
sectionSlug =>
setOpenSections({
...(exclusive ? {} : openSections),
[sectionSlug]: !openSections[sectionSlug]
}),
[]
);
хотя я делаюпохоже, что он сломал exclusive
в процессе, поскольку он теперь всегда включен ..
https://codesandbox.io/s/1o08p08m27
о, я переместил туда несколько других частей, которые могли бы внести вклад висправьте ..
Обновление
изменено для использования useReducer
и перенесло всю логику туда, чтобы мы могли получить стабильную onClick
Обновление
говорят, что сон - это хорошо, но для меня это просто попытка уснуть ..
Я знал, что чего-то не хватает ... понял вчера вечероммне не нужен редуктор, просто форма функции setState
, которая позволяет нам получать доступ к актуальному состоянию из функции useCallback
memoed.Конвертированная здесь оптимизация @ itaydafna https://codesandbox.io/s/8490v55029