Search code examples
javascriptreactjsmaterial-uimaterial-designmern

how to navigate on pages using material ui in reactjs


I am making a drawer for my dashboard using material-Ui, I have faced an issue navigating on my pages

first, I wanna share my app. js and here I have product route

<Provider store={store}>
<BrowserRouter>
    < Routes>
      <Route exact path='/' element={<Login/>} />
      <Route exact path='/dashboard' element={<Dashboard/>} />
      <Route exact path='/product' element={<Product/>}/>
    </Routes>
  </BrowserRouter>
</Provider>

here is my dashboard code:

In this code, I am an object who has an onClick function for navigation on pages

  const listItem = [
    {
      text:'Dashboard',
      onclick:()=>navigate("/dashboard")
    }, 
    {
      text:'Prdocut',
      onclick:()=>navigate("/product")
    } 
  ]

here is my list of who is rendering the items

<List>
  {listItem.map((item, index) => {
    const { text,onClick} = item;
      return (
         <ListItem button key={text} onClick={onClick}>
            <ListItemText primary={text} />
         </ListItem>
        )})}
</List>

but it's not navigation my my product page


Solution

  • Where is the navigate function definition? This should be on the body of the component, using the useNavigate hook from React Router DOM... So your code should look like

    // on top of the file:
    import { useNavigate } from 'react-router-dom';
    
    // on your component:
    const navigate = useNavigate();
    
    const listItem = [
        {
          text:'Dashboard',
          onclick:()=>navigate("/dashboard")
        }, 
        {
          text:'Product',
          onclick:()=>navigate("/product")
        } 
    ];
    
    return (
        <List>
          {listItem.map((item, index) => {
            const { text, onclick } = item;
              return (
                 <ListItem button key={text} onClick={onclick}>
                    <ListItemText primary={text} />
                 </ListItem>
                )})}
        </List>
    );
    

    As a more simple alternative, you may like to use Link component of React Router DOM, importing it like import { Link } from 'react-router-dom'; and using it like this on the jsx:

    const listItem = [
        {
          text:'Dashboard',
          onclick: '/dashboard'
        }, 
        {
          text:'Product',
          onclick: '/product',
        } 
    ];
    
    return (
        <List>
          {listItem.map((item, index) => {
            const { text, onclick } = item;
              return (
                <Link key={text} to={onclick}>
                    <ListItem button>
                    <ListItemText primary={text} />
                    </ListItem>
                </Link>
                )})}
        </List>
    );
    

    Anyways, the error is on the JSX (specifically, on the map function over listItem). In your code, you're destructuring an item like { text, onClick } but it should be NOT camelcase onClick, like this: { text, onclick }.