【发布时间】:2020-10-23 06:23:49
【问题描述】:
我有一个像这样的 React 组件:
https://codepen.io/darajava/pen/NWrdWeP?editors=0010
function TestUseState() {
const [count, setCount] = useState(0);
const buttonRef = useRef(null);
useEffect(() => {
buttonRef.current.addEventListener("click", () => {
alert(count);
});
setCount(10000);
}, []);
return (
<div ref={buttonRef}>
Click
</div>
)
}
我在按钮上设置了一个事件监听器,它似乎取状态的初始值,之后直接设置它。这是预期的行为吗?我怎样才能避免这种情况?
有问题的实际代码(无效,仅添加了相关部分):
const Game = () => {
const canvasRef = useRef<HTMLCanvasElement>(null);
const [player, setPlayer] = useState<IPlayer>();
const setPosition = (newPos) => {
console.log(player); // <--- player is undefined on mousemove
};
useEffect(() => {
canvas = canvasRef.current;
ctx = canvas.getContext('2d');
canvas.addEventListener('mousemove', (e: MouseEvent) => {
setPosition(getCursorPosition(canvas, e));
});
}, []);
return (
<canvas ref={canvasRef} styleName="canvas" />
);
}
【问题讨论】:
-
您已经关闭了初始
count状态进入点击回调。只需使用可以附加到元素的普通onClick处理程序。 -
谢谢德鲁,但这是我实际尝试做的一个非常简化的版本。我在画布 API 上使用“mousemove”。我认为胖箭头功能应该防止关闭?
-
这是一个“陈旧的闭包”:stackoverflow.com/questions/53633698/…
-
如果将
[count]添加到依赖数组中,那么它将计数设置为 10000 并立即重新渲染。 -
如果我将
[count]添加到依赖数组中,则每次count更改时都会添加点击监听器。