Отправка последних реквизитов в прослушиватель событий mousemove

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я работаю над компонентом щелчка и перетаскивания, который:

  • создает moveListener onMouseDown
  • moveListener отправляет действие, которое обновляет некоторые реквизиты компонента ( props.whichChange )
  • mouseUp очищает вышеуказанные прослушиватели событий (и себя)

Проблема в том, что приведенные ниже результаты приводят к тому, что последние реквизиты передаются в 'mousemove функцию прослушивателя событий только один раз onMouseDown , тогда как самые последние реквизиты требуются каждый раз, когда происходит новое mousemove событие.

Как я могу изменить приведенное ниже для достижения этой цели?

 import React, { MouseEvent as ReactMouseEvent } from 'react';

export const MyComponent = props =>

    const generateMoveListener = args => {
        return (event: MouseEvent) => {
            dispatchAction(args);
        };
    };

    const onMouseDown = (event: ReactMouseEvent) => {
        inputsThatShouldntChange = doSomeCalcs(props.thatDontChange)
        const moveListener = generateMoveListener(inputsThatShouldntChange, props.whichChange);
        document.body.addEventListener('mousemove', moveListener);
        document.body.addEventListener('mouseup', function mouseUp() {
            document.body.removeEventListener('mousemove', moveListener);
            document.body.removeEventListener('mouseup', mouseUp);
        });
    };

    return (<ChildComponent onMouseDown={onMouseDown} />);
};
  

Ответ №1:

Эта проблема была решена с useRef помощью и useEffect :

 import React, { 
    MouseEvent as ReactMouseEvent,
    useEffect,
    useRef 
} from 'react';

export const MyComponent = props =>

    useEffect(() => {
        propsRef.current = props;
    }, [props]);

    const onMouseDown = (event: ReactMouseEvent) => {
        if (!propsRef.current) {
            return
        };

        const generateMoveListener = args => {
            return (event: MouseEvent) => {
                dispatchAction(args);
            };
        };

        inputsThatShouldntChange = doSomeCalcs(props.thatDontChange)
        
        const initialProps = props;
        const currentProps = propsRef.current

        const moveListener = generateMoveListener({
            initiapProps, 
            currentProps
        });

        document.body.addEventListener('mousemove', moveListener);

        document.body.addEventListener('mouseup', function mouseUp() {
            document.body.removeEventListener('mousemove', moveListener);
            document.body.removeEventListener('mouseup', mouseUp);
        });
    };

    return (<ChildComponent onMouseDown={onMouseDown} />);
};