Задать вопрос
@MaksZhukov
programer

Как использовать обработчик useCallback в useEffect?

После того как меняется 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]);
  • Вопрос задан
  • 137 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Javascript.ru
    Курс по React
    5 недель
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
1. Меморизированная функция должна инициализироваться за пределами вызова render, иначе она будет пересоздаваться каждый render.
2. Передавать хандлер в массив второго аргумента useEffect бессмысленно, так как вы туда передаете widgets.
3. Не ясно, что вообще делает ваш код и какого поведения вы хотите добиться, так как пример вырван из контекста.
4. Не ясно, что вам мешает использовать классы. Только усложняете простые задачи.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽
ITK academy Казань
от 50 000 до 90 000 ₽