Wagmi useContractEvent 侦听器无法访问 useState 变量

Wagmi useContractEvent listener can't access useState variable

提问人:0xRLA 提问时间:8/4/2023 更新时间:8/4/2023 访问量:229

问:

我被困在这个我真的无法理解的问题上。

尝试从 useContractEvent 中的侦听器函数访问哈希状态变量时,它是未定义的。

我可以在useContractEvent中访问侦听器函数外部的哈希状态变量,但是一旦触发事件并尝试读取侦听器函数中的哈希状态变量,它就是未定义的。

是上下文问题吗?

const [hash, setHash] = useState<`0x${string}` | undefined>();

useContractEvent({
  address: contract.address as `0x${string}`,
  abi: contract.abi,
  eventName: "SomeEvent",
  listener(log) {
    console.log(hash) // undefined
    if (log[0]?.transactionHash != hash) return;
    // never reached
  },
});

const { write } = useContractWrite({
  address: contract.address as `0x${string}`,
  abi: contract.abi,
  functionName: "someFunction",
  args: [],
  onSuccess(data) {
    setHash(data.hash);
  },
});

return (
 <button onClick={() => write?.()}>
    Go
  </button>
);
javascript reactjs 事件 react-hooks wagmi

评论


答:

1赞 Abito Prakash 8/4/2023 #1

是的,您面临的问题可能是由于与闭包相关的上下文问题以及 useContractEvent 和 useContractWrite 的异步性质造成的。

一种方法是始终使用最新的哈希值ref

const hashRef = useRef<`0x${string}` | undefined>();

useContractEvent({
    address: contract.address as `0x${string}`,
    abi: contract.abi,
    eventName: "SomeEvent",
    listener: (log) => {
        console.log(hashRef.current); // This will always log the latest value of `hash`
        if (log[0]?.transactionHash !== hashRef.current) return;
        // never reached
    },
});

const { write } = useContractWrite({
    address: contract.address as `0x${string}`,
    abi: contract.abi,
    functionName: "someFunction",
    args: [],
    onSuccess(data) {
        hashRef.current = data.hash; 
    },
});

return <button onClick={() => write?.()}>Go</button>;

评论

0赞 0xRLA 8/4/2023
这解决了我的问题,谢谢你,好心的先生!