value
is stale in the event handler because it gets its value from the closure where it was defined. Unless we re-subscribe a new event handler every time value
changes, it will not get the new value.
Solution 1: Make the second argument to the publish effect [value]
. This makes the event handler get the correct value, but also causes the effect to run again on every keystroke.
Solution 2: Use a ref
to store the latest value
in a component instance variable. Then, make an effect which does nothing but update this variable every time value
state changes. In the event handler, use the ref
, not value
.
const [value, setValue] = useState(initialValue);
const refValue = useRef(value);
useEffect(() => {
refValue.current = value;
});
const handleEvent = (msg, data) => {
console.info("Value in event handler: ", refValue.current);
};
https://reactjs.org/docs/hooks-faq.html#what-can-i-do-if-my-effect-dependencies-change-too-often
Looks like there are some other solutions on that page which might work too. Much thanks to @Dinesh for the assistance.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…