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

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

Похожие вопросы