next.js OnClick事件后更新状态时出现无限循环

gjmwrych  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(209)

因此,我尝试在单击图标按钮后触发一个弹出菜单。
我使用的是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)

    }
  });

我哪里做错了有什么建议吗

afdcj2ne

afdcj2ne1#

无限循环是由onAuthStateChanged观察器引起的。函数设置了一个监听器,该监听器触发并导致组件重新呈现。新的呈现器设置了另一个监听器,该监听器触发,依此类推。在这种情况下,即使取消订阅也无济于事。
一个可能的解决方法是将其 Package 在一个带有空依赖项数组的useEffect挂接中。

useEffect(() => {
    onAuthStateChanged(auth, (user) => {
        //your user logic...
        if (user) {
            setAuthenticated(true);
        } else {
            setAuthenticated(false);
        }
    });
}, []);

相关问题