【问题标题】:How do I share state between routes in React-Router?如何在 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),然后自己添加了路线。如有任何关于如何解决此问题的反馈,我们将不胜感激。

【问题讨论】:

标签: reactjs react-router material-ui react-router-dom


【解决方案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
  }
}));

【讨论】:

  • 完美运行,感谢您的帮助!
猜你喜欢
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 2019-01-31
  • 2015-02-26
  • 2020-08-07
相关资源
最近更新 更多