Ich versuche, eine Web3-Anwendung zu erstellen. In meinem Frontend möchte ich erkennen, ob der Benutzer sein Konto in der Metamask-Brieftasche geändert oder die Verbindung getrennt hat, und diese Änderung im Frontend anzeigen. Wie kann ich das tun?
const [account, setaccount] = useState('0x0');
window.ethereum.on('accountsChanged',async (accounts) =>{
const changedAccounts =await window.ethereum.request({method: 'eth_requestAccounts'});
setaccount(changedAccounts[0]);
console.log('changedAccounts')
})
useEffect(async () => {
if(!window.ethereum){
window.alert('Please consider installing Metamask');
}else{
const accounts =await window.ethereum.request({method: 'eth_requestAccounts'});
setaccount(accounts[0]);
}
if(!window.ethereum.isConnected()){
console.log('Disconnected')
}else{
console.log('Connected')
}
console.log('useEffect')
}, [account]);
Es gibt weitere Ereignisse zum Anhören, um alle Anwendungsfälle abzudecken. Außerdem sollten das Event-Abonnement und die Bereinigung in einen verschoben werden, useEffect
um Speicherlecks zu stoppen.
Dies ist ein Beispiel, das Ihnen den Einstieg erleichtern könnte ...
const [account, setaccount] = useState('0x0');
useEffect(() => {
if (!window.ethereum) {
// Nothing to do here... no ethereum provider found
return;
}
const accountWasChanged = (accounts) => {
setaccount(accounts[0]);
console.log('accountWasChanged');
}
const getAndSetAccount = async () => {
const changedAccounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
setaccount(changedAccounts[0]);
console.log('getAndSetAccount');
}
const clearAccount = () => {
setaccount('0x0');
console.log('clearAccount');
};
window.ethereum.on('accountsChanged', accountWasChanged);
window.ethereum.on('connect', getAndSetAccount);
window.ethereum.on('disconnect', clearAccount);
window.ethereum.request({ method: 'eth_requestAccounts' }).then(accounts => {
console.log('accounts', accounts);
// No need to set account here, it will be set by the event listener
}, error => {
// Handle any UI for errors here, e.g. network error, rejected request, etc.
// Set state as needed
})
return () => {
// Return function of a non-async useEffect will clean up on component leaving screen, or from re-reneder to due dependency change
window.ethereum.off('accountsChanged', accountWasChanged);
window.ethereum.off('connect', getAndSetAccount);
window.ethereum.off('disconnect', clearAccount);
}
}, [/* empty array to avoid re-request on every render, but if you have state related to a connect button, put here */]);
Strahlender_Performer_39
account
gleich dem des anderen verbundenen Kontos und das wird im Frontend widergespiegelt. Obwohl wir das Girokonto getrennt haben. Wie geht man mit diesem Fall um?CaptEmulation
accountsChanged
Ereignis, das Sie verarbeiten können, um Ihren Anwendungsstatus zu aktualisieren