提问人:0xRLA 提问时间:8/4/2023 更新时间:8/4/2023 访问量:229
Wagmi useContractEvent 侦听器无法访问 useState 变量
Wagmi useContractEvent listener can't access useState variable
问:
我被困在这个我真的无法理解的问题上。
尝试从 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>
);
答:
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
这解决了我的问题,谢谢你,好心的先生!
评论