Search code examples
reactjsmenuantd

How to change Content based on Menu Item click in AntD (React UI Library)


I am following AntD Menu tutorial from here and it shows how to use this component. But I am failed to understand that how to change my Content when I click on different menu option. Tried searching a lot but did not find any useful help.

 import { Layout, Menu, Icon } from 'antd';

const { Header, Sider, Content } = Layout;

class SiderDemo extends React.Component {
  state = {
    collapsed: false,
  };

  toggle = () => {
    this.setState({
      collapsed: !this.state.collapsed,
    });
  }

  render() {
    return (
      <Layout>
        <Sider
          trigger={null}
          collapsible
          collapsed={this.state.collapsed}
        >
          <div className="logo" />
          <Menu theme="dark" mode="inline" defaultSelectedKeys={['1']}>
            <Menu.Item key="1">
              <Icon type="user" />
              <span>nav 1</span>
            </Menu.Item>
            <Menu.Item key="2">
              <Icon type="video-camera" />
              <span>nav 2</span>
            </Menu.Item>
            <Menu.Item key="3">
              <Icon type="upload" />
              <span>nav 3</span>
            </Menu.Item>
          </Menu>
        </Sider>
        <Layout>
          <Header style={{ background: '#fff', padding: 0 }}>
            <Icon
              className="trigger"
              type={this.state.collapsed ? 'menu-unfold' : 'menu-fold'}
              onClick={this.toggle}
            />
          </Header>
          <Content style={{ margin: '24px 16px', padding: 24, background: '#fff', minHeight: 280 }}>
            Some Conent
          </Content>
        </Layout>
      </Layout>
    );
  }
}

ReactDOM.render(<SiderDemo />, mountNode);

Can you pls help.


Solution

  • Just WRAP your Layout tag inside Router tag of react-router-dom.

    import React, { Component } from 'react';
    import { BrowserRouter as Router, Route, Link } from "react-router-dom";
    import { Layout, Menu, Icon } from 'antd';
    
    import Dashboard from './containers/Dashboard/Dashboard';
    import Meseros from './containers/Meseros/Meseros';
    
    const { Header, Content, Footer, Sider } = Layout;
    const SubMenu = Menu.SubMenu;
    
    class RouterApp extends Component {
    
        state = {
            collapsed: false,
        };
    
        onCollapse = (collapsed) => {
            this.setState({ collapsed });
        }
        toggle = () => {
            this.setState({
                collapsed: !this.state.collapsed,
            });
        }
    
        render() {
            return (
                <Router>
                    <Layout style={{ minHeight: '100vh' }}>
    
                        <Sider
                            collapsible
                            collapsed={this.state.collapsed}
                            onCollapse={this.onCollapse}>
                            <div className="logo" />
                            <Menu theme="dark" defaultSelectedKeys={['1']} mode="inline">
                                <Menu.Item key="1">
                                    <Icon type="pie-chart" />
                                    <span>Deshboard</span>
                                    <Link to="/" />
                                </Menu.Item>
                                <Menu.Item key="2">
                                    <Icon type="desktop" />
                                    <span>Meseros</span>
                                    <Link to="/meseros" />
                                </Menu.Item>
                            </Menu>
                        </Sider>
                        <Layout>
                            <Header style={{ background: '#fff', padding: 0, paddingLeft: 16 }}>
                                <Icon
                                    className="trigger"
                                    type={this.state.collapsed ? 'menu-unfold' : 'menu-fold'}
                                    style={{ cursor: 'pointer' }}
                                    onClick={this.toggle}
                                />
                            </Header>
                            <Content style={{ margin: '24px 16px', padding: 24, background: '#fff', minHeight: 280 }}>
                                <Route exact path="/" component={Dashboard} />
                                <Route path="/meseros" component={Meseros} />
                            </Content>
    
                        </Layout>
    
                    </Layout>
                </Router>
            );
        }
    }
    
    
    export default RouterApp;