因此,我尝试在单击图标按钮后触发一个弹出菜单。
我使用的是MUI,
所以我复制了演示代码来测试它,
<div>
<IconButton onClick={handleOpenMenu}
aria-controls={open ? 'basic-menu' : undefined}
aria-haspopup="true"
aria-expanded={open ? 'true' : undefined}
>
<MoreVertIcon />
</IconButton>
<Menu
id="demo-positioned-menu"
aria-labelledby="demo-positioned-button"
anchorEl={anchorEl}
open={open}
onClose={handleMenuClose}
anchorOrigin={{
vertical: 'top',
horizontal: 'left',
}}
transformOrigin={{
vertical: 'top',
horizontal: 'left',
}}
>
<MenuItem onClick={handleMenuClose}>Profile</MenuItem>
<MenuItem onClick={handleMenuClose}>My account</MenuItem>
<MenuItem onClick={handleMenuClose}>Logout</MenuItem>
</Menu>
</div>
这里是事件处理程序,
const [anchorEl, setAnchorEl] = useState(null);
const open = Boolean(anchorEl);
const handleOpenMenu = (event) => {
setAnchorEl(event.currentTarget);
};
const handleMenuClose = () => {
setAnchorEl(null);
};
但是,每当我按下IconButton时,它就会冻结整个UI,并出于某些原因在无限循环中打印我的Firebase OnAuthStateChanges函数。
var unsubscribe = onAuthStateChanged(auth, (user) => {
if (user) {
const uid = user.uid;
console.log(uid)
setAuthenticated(true)
} else {
setAuthenticated(false)
}
});
我哪里做错了有什么建议吗
1条答案
按热度按时间afdcj2ne1#
无限循环是由
onAuthStateChanged
观察器引起的。函数设置了一个监听器,该监听器触发并导致组件重新呈现。新的呈现器设置了另一个监听器,该监听器触发,依此类推。在这种情况下,即使取消订阅也无济于事。一个可能的解决方法是将其 Package 在一个带有空依赖项数组的
useEffect
挂接中。