【发布时间】:2021-05-03 14:15:17
【问题描述】:
我有一个名为 useQueryEvents 的钩子,它 1) 为用户获取所有过去的交易,以及 2) 监听网络的传入/传出交易。在这两种情况下,事务都被传递到函数 addActionToActivity,该函数只是将其附加到活动数组并在键 activity 下的上下文状态中更新它。
我无法正确同步活动。每当状态更新时,它都没有最后一笔交易,因为它总是落后一步。如果我将activity 添加到依赖关系中,它会起作用,但随后会启动一个新的侦听器(由于使用新的activity 值再次调用整个函数),这会导致无限循环,不断切换状态。
function useQueryEvents() {
const { state: { connectedNetwork, selectedWallet, activity },
} = useContext(LocalContext);
useEffect(() => {
async function bootstrapQueryEvents() {
// First get all the past transactions
const transactions = await getAllPastTransactions();
const contract = await getContract();
// Now save them to context state via addActionToActivity
await addActionToActivity(transactions, activity);
// Now that all the past transactions have been saved
// listen to all incoming/outgoing transactions and
// save to context state via addActionToActivity
contract.on('Transfer', async (from, to, amount, event) => {
console.log(`${from} sent ${ethers.utils.formatEther(amount)} to ${to}`);
const transaction = await formatEventToTransaction(event);
await addActionToActivity(transaction, activity);
});
}
bootstrapQueryEvents();
}, [selectedAsset, connectedNetwork, selectedWallet]); // <- I've tried adding `activity` here
}
有什么想法可以在访问侦听器内更新的activity 值的同时更新状态启动侦听器的新实例?或者也许我可以完全采取不同的方法?
提前致谢
【问题讨论】:
-
您能把
addActionToActivity中使用的代码贴出来吗?只是想检查它如何处理事务数组和事务。另外,当您的意思是它减一时,这是否意味着contract.on确实会触发重新渲染? -
如果不了解 addActionToActivity 中的内容,我们将无法真正帮助您。你如何更新状态?直接修改状态吗?
-
useEffect中为什么没有使用任何依赖项?selectedAsset来自哪里?
标签: javascript reactjs react-native listener