如何在 React-Router 中的路由之间共享状态?

Posted

技术标签:

【中文标题】如何在 React-Router 中的路由之间共享状态?【英文标题】:How do I share state between routes in React-Router? 【发布时间】:2022-01-14 14:30:21 【问题描述】:

我在 SO 上看到了一些与此类似的问题,但没有一个完全符合我的需求。我正在使用 React 和 Material-UI 来制作仪表板。我使用 Material-UI 的迷你变体抽屉作为侧边栏,单击时应显示路线的链接。侧边栏可以通过单击按钮打开,该按钮会更新状态变量并调整侧边栏的 CSS className。这会导致侧边栏/抽屉“滑动”打开。

如果我单击侧边栏上的链接,我可以轻松地显示所需的路线。但是,当侧边栏/抽屉打开时,我无法获得“滑动”到一边的路线。通过查看代码可能会更容易理解,所以我在下面提供了一个代码框的链接:

https://codesandbox.io/s/appbar-with-react-router-bkogj?file=/src/App.js

我基本上从 Material-UI 网站复制并粘贴了所有内容(我相信使用 v4),然后自己添加了路线。如有任何关于如何解决此问题的反馈,我们将不胜感激。

【问题讨论】:

你看过 mui Persistent 抽屉了吗? mui.com/components/drawers 这实际上应该为您提供所需的一切:) 【参考方案1】:

为此,我认为MiniDrawer 组件需要渲染内容,因为它必须知道应用栏和抽屉组件占用的空间。

迷你抽屉

获取并渲染一个children 道具。

export default function MiniDrawer( children ) 
  ...

  return (
    <div className=classes.root>
      <CssBaseline />
      <AppBar
        ...
      >
        ...
      </AppBar>
      <Drawer
        ...
      >
        ...
      </Drawer>
      <main className=classes.content>children</main>
    </div>
  );

应用

Outlet 渲染为子组件。

export default function App() 
  return (
    <div className="App">
      <AppBar>
        <Outlet />
      </AppBar>
    </div>
  );

拒绝表

移除多余的边距,使其填充父组件允许的内容区域。

const useStyles = makeStyles((theme) => (
  content: 
    flexGrow: 1,
    padding: theme.spacing(3),
    height: "100%",
    // marginLeft: "4em" // <-- remove
  
));

【讨论】:

完美运行,感谢您的帮助!

以上是关于如何在 React-Router 中的路由之间共享状态?的主要内容,如果未能解决你的问题,请参考以下文章

react-router 4.0这个路由怎么配置

react-router(不同组件之间传递路由)

React-Router:如何在路由转换之前等待异步操作

在反应路由器中的路由之间显示一个简单的加载指示器

react-router 如何从数组生成路由?

如何限制对 react-router 中路由的访问?