簡體   English   中英

如何更新事件的 useCallback 掛鈎

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

我需要更新 eventEmitter3 發出的某個事件的 useCallback 掛鈎。 現在我用當前時間更新本地 state 以觸發 useCallback。 這行得通,但看起來很復雜。 有更好的解決方案嗎?

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]);

我建議通過 ref 提取最新值,而不是更新回調。

通常,對於回調,如果您在運行它們時提取值,則不需要更新它們。 我並不是建議你總是默認這樣做,但在某些情況下,如果你可以重新架構以拉動調用,它可以清理事情。

const someRef = useRef(null);

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

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

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

正如 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