Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在物料UI抽屉中使用React浏览器路由器_Javascript_Reactjs_React Router_Material Ui - Fatal编程技术网

Javascript 如何在物料UI抽屉中使用React浏览器路由器

Javascript 如何在物料UI抽屉中使用React浏览器路由器,javascript,reactjs,react-router,material-ui,Javascript,Reactjs,React Router,Material Ui,我试图弄清楚如何在react中使用浏览器路由器来填充材质UI抽屉的内容部分 代码用于使菜单选项链接到抽屉内容部分中显示的组件,但是,当页面刷新时,会出现问题,因为抽屉内容中呈现的组件没有顶级路由。具有抽屉的实际页面(即顶层路由)应在页面刷新时重新加载,但重新加载的url中的地址正在尝试使用内容组件 我的代码是: import React, { useState, useEffect } from 'react'; import { Switch, Route, Link, Browser

我试图弄清楚如何在react中使用浏览器路由器来填充材质UI抽屉的内容部分

代码用于使菜单选项链接到抽屉内容部分中显示的组件,但是,当页面刷新时,会出现问题,因为抽屉内容中呈现的组件没有顶级路由。具有抽屉的实际页面(即顶层路由)应在页面刷新时重新加载,但重新加载的url中的地址正在尝试使用内容组件

我的代码是:

   import React, {  useState, useEffect } from 'react';
import { Switch, Route, Link, BrowserRouter, useParams,
    useRouteMatch } from "react-router-dom";
import { makeStyles } from '@material-ui/core/styles';
import Drawer from '@material-ui/core/Drawer';
import AppBar from '@material-ui/core/AppBar';
import CssBaseline from '@material-ui/core/CssBaseline';
import Toolbar from '@material-ui/core/Toolbar';
import List from '@material-ui/core/List';
import Typography from '@material-ui/core/Typography';
import Divider from '@material-ui/core/Divider';
import ListItem from '@material-ui/core/ListItem';
import ListItemIcon from '@material-ui/core/ListItemIcon';
import ListItemText from '@material-ui/core/ListItemText';
import theme from "../../../services/appearance/theme";
import { MuiThemeProvider } from '@material-ui/core/styles';


import Menu1 from "../../menu/First";
import Menu2 from "../../menu/Second";



const drawerWidth = 240;

const useStyles = makeStyles((theme) => ({
  root: {
    display: 'flex',
  },
  appBar: {
    zIndex: theme.zIndex.drawer + 1,
  },
  drawer: {
    width: drawerWidth,
    flexShrink: 0,
  },
  drawerPaper: {
    width: drawerWidth,
  },
  drawerContainer: {
    overflow: 'auto',
  },
  content: {
    flexGrow: 1,
    padding: theme.spacing(3),
    maxWidth: `calc(100vw - ${drawerWidth}px)`
  },
}));

export default function ClippedDrawer() {
  const classes = useStyles();
  let { path, url } = useRouteMatch();
  let { topicId } = useParams();



  return (
    <div className={classes.root}>
    <MuiThemeProvider theme={theme}>
      <CssBaseline />
      <AppBar position="fixed" className={classes.appBar}>
       test
      </AppBar>
     <BrowserRouter>
      <Drawer
        className={classes.drawer}
        variant="permanent"
        classes={{
          paper: classes.drawerPaper,
        }}
      >
        <Toolbar />
        <div className={classes.drawerContainer}>
        <List>
            
        <ListItem button key="1" component={Link}  to={`${url}/Menu1`}
        >
            <ListItemText primary="First Menu"></ListItemText> 
        </ListItem>
        <ListItem button key="2" component={Link} to={`${url}/Menu2`}>
            <ListItemText>Second Menu</ListItemText> 
        </ListItem>
        
    </List>
        </div>
      </Drawer>
      <main className={classes.content}>
        <Toolbar>test</Toolbar> 

        <Switch>
            <Route path={`${path}/:Menu1`}>
            <Menu1 />
            </Route>
            <Route path={`${path}/:Menu2`}>
            <Menu2 />
            </Route>
        </Switch>    
        
        
        
      </main>
      </BrowserRouter>
    </MuiThemeProvider>  
    </div>
  );
}
import React,{useState,useffect}来自“React”;
导入{交换机、路由、链路、浏览器路由器、useParams、,
“react router dom”中的useRouteMatch};
从'@material ui/core/styles'导入{makeStyles};
从“@material ui/core/Drawer”导入抽屉;
从“@material ui/core/AppBar”导入AppBar;
从“@material ui/core/CssBaseline”导入CssBaseline;
从“@material ui/core/Toolbar”导入工具栏;
从“@material ui/core/List”导入列表;
从“@material ui/core/Typography”导入排版;
从“@material ui/core/Divider”导入分隔器;
从“@material ui/core/ListItem”导入ListItem;
从“@material ui/core/ListItemIcon”导入ListItemIcon;
从“@material ui/core/ListItemText”导入ListItemText;
从“../../../services/appearance/theme”导入主题;
从'@material ui/core/styles'导入{MuiThemeProvider};
从“../../menu/First”导入菜单1;
从“../../menu/Second”导入菜单2;
常数抽屉宽度=240;
const useStyles=makeStyles((主题)=>({
根目录:{
显示:“flex”,
},
appBar:{
zIndex:theme.zIndex.drawer+1,
},
出票人:{
宽度:抽屉宽度,
flexShrink:0,
},
抽屉纸:{
宽度:抽屉宽度,
},
付款人:{
溢出:“自动”,
},
内容:{
flexGrow:1,
填充:主题。间距(3),
maxWidth:`calc(100vw-${drawerWidth}px)`
},
}));
导出默认函数ClippedDrawer(){
const classes=useStyles();
让{path,url}=useRouteMatch();
设{topicId}=useParams();
返回(
)

在该页面中,是一个材质UI抽屉,该抽屉具有一个菜单,该菜单带有指向在该索引页面的内容中呈现的组件的链接

当我第一次加载页面时,我得到localhost:3000/index。我单击该页面上的Menu1菜单项,url地址更改为:localhost3000/Home/Menu1(并显示材质UI抽屉的内容窗口,其中包含Menu1组件-全部正确)。我可以刷新该页面,url地址保持正确

但是,当我单击菜单栏中的Menu2时,url地址将更改为Home/Menu2,但内容窗口中仍然填充着Menu1组件。它应该显示Menu2


如何调整文档中的嵌套路由示例以与材质UI抽屉一起使用?

您必须使用App.js中的浏览器路由器。因此,它不会为您提供空白页。如下所示:

 <BrowserRouter>
 <MarerialUIDrawer/>
  <Switch>
    <Route exact path='/' render=
        {props => <Home {...props} /> }/>
    <Route exact path='/about' render=
        {props => <About {...props} /> }/>
    <Route exact path='/contact' render=
        {props => <Contact {...props} /> }/>
  </Switch>
</BrowserRouter>

}/>
}/>
}/>
导出默认应用程序

我想我找到了

我在路径中不需要冒号

这:

应该是:


您是否看到有关嵌套路由器的文档?嗨-不,你误解了。我确实使用App.js中的浏览器路由器(它覆盖了应用程序中的主要页面)。但是,要切换物料UI抽屉的内容(与抽屉菜单中的项目相对应),有一个不同的问题。谢谢你的努力。