React Router V4 侧边栏菜单中的错误 [英] Bugs in Sidebar Menu with React Router V4

查看:66
本文介绍了React Router V4 侧边栏菜单中的错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个单页 ReactJS Web 应用程序,但我知道在使用 React Router V4 定义路由时我做错了.

I'm developing a single-page ReactJS Web app but I know I'm doing something wrong while defining my routing with React Router V4.

我的问题如下:routes.js 文件中的 PrivateRoute 没有按预期工作.也就是说,我不知道为什么但是我的侧边栏菜单(我的主 App 的子组件)无法正常工作:当我单击我的主App 的菜单项时有一些错误PrivateRoute 组件(在本例中为 Page1).当我说错误时,我的意思是当我单击 PrivateRoute 的菜单项时,侧边栏菜单配置错误.组件的内容 (Page1) 已呈现,但侧边栏菜单中的菜单项没有保持高亮显示:它被重定向到列表中的第一个菜单项,在这种情况下 MainHome.

My problem is as follows: PrivateRoute in my routes.js file is not working as expected. That is, I don't know why but my sidebar menu, which is a child component of my main App, does not work properly: there are a few bugs when I click on the menu item of my PrivateRoute component (in this case, Page1). When I say bugs, I mean that when I click on the menu item of a PrivateRoute, the sidebar menu is misconfigured. The content of the component (Page1) is rendered but the menu item in the sidebar menu does not stay highlighted as it should be: it is redirected to the first menu item on the list, in this case MainHome.

尽管如此,如果我在 routes.js 中将 Page1 组件的标签从 PrivateRoute 更改为 ConfigRoute> 文件,一切正常.

Nonetheless, if I change the tag of my Page1 component from PrivateRoute to ConfigRoute in my routes.js file, everything works properly.

来自我的文件 index.js (main)、routes.jsApp.jsside- 的示例-menu.js:

A sample from my files index.js (main), routes.js, App.js, and side-menu.js:

index.js(主)文件:

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import Routes from './routes';
import store from './store';

ReactDOM.render(
  <Provider store={store}>
    <Routes/>
  </Provider>,
  document.getElementById('root')
);

routes.js 文件:

import React, { Fragment } from 'react';
import { BrowserRouter, Switch, Route, Redirect } from 'react-router-dom';
import { connect } from 'react-redux';
import Login from './login';
import App from './App';
import MainHome from './home';
import Page1 from './page1';

const ConfigRoute = ({ component: Component, layout: Layout, ...rest }) => (
  <Route {...rest} render={(props) => (
    <Layout>
      <Component {...props}/>
    </Layout>
  )}/>
);

const PrivateRoute = ({ component: Component, layout: Layout, auth_status, ...rest }) => (
  <Route {...rest} render={(props) => (
    <Fragment>
      {auth_status === true
        ? (
          <Layout>
            <Component {...props}/>
          </Layout>
          )
        : (
          <Redirect to={{ pathname: "/", state: { from: props.location } }}/>
          )
      }
    </Fragment>
  )}/>
);

const Routes = (props) => (
  <Router>
    <Switch>
      <Route exact path="/" component={Login}/>
      <ConfigRoute path="/home" layout={App} component={MainHome}/>
      <PrivateRoute path="/page1" auth_status={props.auth_status} layout={App} component={Page1}/>
    </Switch>
  </Router>
);

const mapStatetoProps = state => ({
  auth_status: state.auth.isAuthenticated,
});

export default connect(mapStatetoProps)(Routes);

App.js 文件

import React, { Component } from 'react';
import { Layout } from 'antd';
import SideMenu from './side-menu';
import MainHeader from './main-header';
import MainFooter from './main-footer';

const { Content } = Layout;

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      collapsed: false,
    };
  }

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

  render() {
    return (
      <Layout style={{ minHeight: '100vh' }}>
        <SideMenu collapsed={this.state.collapsed}/>
        <Layout>
          <MainHeader triggerParentUpdate={this.toggle} collapsed={this.state.collapsed}/>
          <Content style={{ margin: '24px 16px', padding: 24, background: '#ffffff', minHeight: 280 }}>
            {this.props.children}
          </Content>
          <MainFooter/>
        </Layout>
      </Layout>
    );
  }
}

export default App;

side-menu.js 文件:

import React from 'react';
import { Layout, Menu, Icon } from 'antd';
import { NavLink } from 'react-router-dom';

const { Sider } = Layout;
const SubMenu = Menu.SubMenu;

class SideMenu extends React.Component {

  render() {
    return (
      <Sider
        trigger={null}
        collapsible
        collapsed={this.props.collapsed}
        >
          <div className="logo"/>
          <Menu theme="dark" mode="inline" defaultSelectedKeys={['1']}>
            <Menu.Item key="1">
              <NavLink to="/home">
                <Icon type="home"/>
                <span>home</span>
              </NavLink>
            </Menu.Item>
            <Menu.Item key="2">
              <NavLink to="/page1">
                <Icon type="star-o"/>
                <span>page 1</span>
              </NavLink>
            </Menu.Item>       
          </Menu>
        </Sider>
    );
  }
}

export default SideMenu;

推荐答案

我找到了一种可能的解决方案 here - 使用路径作为菜单键并提供位置作为selectedKeys:

I found one possible solution here - use the path as the menu keys and provide the location as the selectedKeys:

<Menu mode="inline" selectedKeys={[location.pathname]}>
  <Menu.Item key="/home">
    <Link to="/home">Home </Link>
  </Menu.Item>
...

您可以在此处

希望有帮助!

这篇关于React Router V4 侧边栏菜单中的错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆