javascript - 将最新的道具发送到 mousemove 事件监听器
问题描述
我正在开发一个单击并拖动组件,它:
- 创建一个
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} />);
};
解决方案
这个问题用useRef
and解决了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} />);
};
推荐阅读
- pandas - 如何通过迭代其他两个 Dataframes 列来获取新的 DF 列?
- amazon-web-services - aws rds 存储长文本问题
- mysql - MySQL Tunner:在磁盘上创建的临时表比例很高 - 网站响应缓慢
- python-3.7 - 减少方程循环
- android - java.lang.NoSuchMethodError: 没有接口方法getTopRatedMoviesAsync()Lkotlinx/coroutines/Deferred;
- amazon-web-services - 让 SNS 以编程方式工作...通过命令行工作
- java - 如何从 sqlite 数据库中获取总金额值
- sql-server - 从 SQL 运行的 Exe 运行但返回 Web 服务错误,直接运行工作正常
- javascript - 单击复选框将输入更改为 css
- javascript - 如何在每列增加1的情况下连续循环,依此类推