为什么 React 在触发事件时会触发 console.logs 8 次?
Why does React fires console.logs 8 times when an event is triggered?
我是 React 的新手,我不明白为什么我的应用程序渲染了 2 或 8 次。
我正在使用 window.ethereum 与 MetaMask 交互,并有一个监听器在我更改 MetaMask 中的一个帐户时触发。这应该每次只触发 console.logs 一次,但它们被触发了 8 次。
如果我删除 useEffect 它们会被触发 2 次。所有应用中均无其他 useEffects。
useEffect((loading) => {
let isMounted = true;
setDarkMode(JSON.parse(localStorage.getItem('isDark')));
setLoading(true);
loadBloackchainData(isMounted, loading);
// cleanup
return () => (isMounted = false);
}, []);
const ethereum = window.ethereum
ethereum.on('accountsChanged', function (accounts) {
console.log('is metamask installed?', ethereum.isMetaMask);
console.log('ethereum.networkVersion : ', ethereum.networkVersion );
console.log('ethereum.selectedAddress : ', ethereum.selectedAddress );
});
为什么被解雇 8 次?
也许您无意中在每个渲染器上添加了一个新的 accountsChanged
处理程序?
每次渲染时,您可能会添加一个新的处理程序,当帐户信息发生变化时,您的应用程序可能会调用它。你应该 subscribe/unsubscribe 来自 useEffect
:
中的那个事件
useEffect(() => {
const ethereum = window.ethereum
const doAccountThings = (accounts) => {
// do account stuff
}
ethereum.on('accountsChanged', doAccountThings)
return () => {
// here unsubscribe from the doAccountThings handler,
// whatever that syntax is.
}
}, [])
useEffect 文档描述了在订阅后您可能需要使用此技术进行清理的方式和原因:https://reactjs.org/docs/hooks-effect.html#example-using-hooks-1
我是 React 的新手,我不明白为什么我的应用程序渲染了 2 或 8 次。
我正在使用 window.ethereum 与 MetaMask 交互,并有一个监听器在我更改 MetaMask 中的一个帐户时触发。这应该每次只触发 console.logs 一次,但它们被触发了 8 次。
如果我删除 useEffect 它们会被触发 2 次。所有应用中均无其他 useEffects。
useEffect((loading) => {
let isMounted = true;
setDarkMode(JSON.parse(localStorage.getItem('isDark')));
setLoading(true);
loadBloackchainData(isMounted, loading);
// cleanup
return () => (isMounted = false);
}, []);
const ethereum = window.ethereum
ethereum.on('accountsChanged', function (accounts) {
console.log('is metamask installed?', ethereum.isMetaMask);
console.log('ethereum.networkVersion : ', ethereum.networkVersion );
console.log('ethereum.selectedAddress : ', ethereum.selectedAddress );
});
为什么被解雇 8 次?
也许您无意中在每个渲染器上添加了一个新的 accountsChanged
处理程序?
每次渲染时,您可能会添加一个新的处理程序,当帐户信息发生变化时,您的应用程序可能会调用它。你应该 subscribe/unsubscribe 来自 useEffect
:
useEffect(() => {
const ethereum = window.ethereum
const doAccountThings = (accounts) => {
// do account stuff
}
ethereum.on('accountsChanged', doAccountThings)
return () => {
// here unsubscribe from the doAccountThings handler,
// whatever that syntax is.
}
}, [])
useEffect 文档描述了在订阅后您可能需要使用此技术进行清理的方式和原因:https://reactjs.org/docs/hooks-effect.html#example-using-hooks-1