【问题标题】:How to change the state when going to previous or next page with React?使用 React 转到上一页或下一页时如何更改状态?
【发布时间】:2022-01-02 08:09:09
【问题描述】:

我有一个状态来跟踪打开子菜单时的状态,并在单击另一个菜单项时切换它。它是这样的:

    const [open, setOpen] = useState();
    const toggle = (id) => setOpen(id);

    onClick={() => toggle(item.navId)}

因此,每次我单击菜单项时,它都会关闭/打开子菜单。但是当我单击浏览器的按钮转到上一页或下一页时,当前打开的子菜单保持打开状态,它不会打开被重定向的子菜单,也不会关闭当前打开的子菜单。当我使用浏览器中的上一个/下一个按钮浏览页面时,我可以使用什么,就像 onClick 更改 state 一样?谢谢!

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    如果你使用 react 路由器,你可以使用useLocation 钩子和useEffect 来处理路由更改时关闭菜单

    const {pathname} = useLocation();
    useEffect(()=>{
      setOpen(//whatever here)
    },[pathname])
    

    【讨论】:

    • 我确实是。我会试一试。非常感谢。
    • 我试了一下,但还是不太对。我可以关闭菜单,但当前菜单不会打开,除非我点击它。我相信我必须为setOpen() 设置一些参数,但不太确定怎么做。这是我能想到的:let location = SidebarData.map((item) => { return ( item.path ) }); location = useLocation(); const link = location.pathname; useEffect(() => { setOpen() }, [link]);关于我做错了什么有什么建议吗?
    【解决方案2】:

    我发现了一个类似的堆栈帖子here,我相信有人的回答可能会帮助您进行一些修改

    import React from "react";
    import useHistory from "react-router-dom";
    import { SubMenu, OtherComponent } from './'; // import your actual components here
    
    export default function YourComponent() {
    
      const [open, setOpen] = React.useState(false); // toggle submenu
      const [locationKeys, setLocationKeys] = React.useState([]);
      const history = useHistory();
    
      React.useEffect(() => {
        return history.listen((location) => {
          if (history.action === "PUSH") {
            if (location.key) setLocationKeys([location.key]);
          }
    
          if (history.action === "POP") {
            if (locationKeys[1] === location.key) {
              setLocationKeys(([_, ...keys]) => keys);
    
              // Handle forward event
              console.log("forward button");
              setOpen(!open); // toggle submenu
            } else {
              setLocationKeys((keys) => [location.key, ...keys]);
    
              // Handle back event
              console.log("back button");
              setOpen(!open); // toggle submenu
            }
          }
        });
      }, [locationKeys, history]);
    
      return (
        <div>
          {open ?? <SubMenu/>}
          // or
          {open ? <SubMenu/> : <OtherComponent/>}
        </div>
      );
    }
    

    【讨论】:

    • 我能够实施这个解决方案。我想谈两件事。首先,它工作得很好,当前的 SubMenu 关闭,但是当导航到上一个或下一个 SubMenu 时,这个没有打开。其次,我不得不在另一个版本上尝试这种方法,正如我提到的那样,因为我目前使用的是 react-router-dom v6,useHistoryuseNavigate 取代。我试图用useNavigate 来实现它,但没有成功。关于如何使用 react-router-dom v6 实现的任何方向?我尝试阅读一些文档,但找不到解决方案。谢谢。
    • 很高兴我能帮上忙!我也会研究 useNavigate ,看看是否可以提供进一步的帮助。
    猜你喜欢
    • 2020-03-26
    • 2021-09-20
    • 1970-01-01
    • 2017-03-06
    • 2021-06-28
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多