简体   繁体   English

如何更新事件的 useCallback 挂钩

[英]How to update a useCallback hook on a event

I need to update a useCallback hook on a certain event that is emitted by eventEmitter3.我需要更新 eventEmitter3 发出的某个事件的 useCallback 挂钩。 Right now I update a local state with the current time to trigger the useCallback.现在我用当前时间更新本地 state 以触发 useCallback。 That works but looks crazy complicated.这行得通,但看起来很复杂。 Is there a better solution?有更好的解决方案吗?

const [referencesDidChange, setReferencesDidChange] = useState(0);

useEffect(() => {
    const referencesChange = () => {
        setReferencesDidChange(new Date().getTime());
    };
    eventEmitter.on(Events.ReferencesChange, referencesChange);
    return () => {
        eventEmitter.removeListener(Events.ReferencesChange, referencesChange);
    };
}, []);

const renderLeaf = useCallback(props => <Leaf {...props} />, [referencesDidChange]);

I would suggest pulling the most recent values via a ref instead of updating the callback.我建议通过 ref 提取最新值,而不是更新回调。

In general, with callbacks, you don't need to update them if you pull values at the time of running them.通常,对于回调,如果您在运行它们时提取值,则不需要更新它们。 I'm not suggesting that you always do this by default but in certain cases it can clean things up if you rearchitect to pull on invocation if you can.我并不是建议你总是默认这样做,但在某些情况下,如果你可以重新架构以拉动调用,它可以清理事情。

const someRef = useRef(null);

useEffect(() => {
  someRef.current = someChangingValue;
}, [someChangingValue]);

const renderLeaf = useCallback(() => {
  const latestValues = someRef.current;

  // use latest values…
}, []);

As Rico Kahler pointet out in the comments in his answer, there is a react docs example on this, which results in the much clearer:正如 Rico Kahler 在他的回答中的评论中指出的那样,有一个关于此的 react docs 示例,结果更加清晰:

const [referencesDidChange, setReferencesDidChange] = useReducer(x => x + 1, 0);

useEffect(() => {
    eventEmitter.on(Events.ReferencesChange, setReferencesDidChange);
    return () => {
        eventEmitter.removeListener(Events.ReferencesChange, setReferencesDidChange);
    };
}, []);

const renderLeaf = useCallback(props => <Leaf {...props} />, [referencesDidChange]);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM