简体   繁体   English

活动类在react-router-dom库的NavLink中不起作用

[英]Active class not working in NavLink of react-router-dom library

I have created a navigation bar using react-boostrap library and I have used NavLink from react-router-dom library for nav items. 我已经使用react-boostrap库创建了导航栏,并使用NavLink来自react-router-dom库中的NavLink进行导航。 But activeClassName prop of NavLink is not working for me. 但是activeClassName的道具NavLink是不是为我工作。 It doesn't append to the active class automatically. 它不会自动追加到活动类中。 I have used activeStyle prop also. 我也用过activeStyle道具。 It does not work. 这是行不通的。 Below is my code. 下面是我的代码。

// NavigationBar.js
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { Redirect } from 'react-router-dom';
import { Navbar, NavDropdown } from 'react-bootstrap';

import { logOutUser } from '../../actions/UserActions';
import NavBarItems from '../../components/NavbarItems/NavbarItems';

class NavBar extends Component {
    state = {
        isLogOut: false
    }

    componentDidUpdate(prevProps) {
        if (prevProps.user.logout !== this.props.user.logout) {
            this.setState({isLogOut: true});
        }
    }

    handleSingnOutOnclick = () => {
        this.props.dispatch(logOutUser());
    }

    render() {
        let loggedUser = localStorage.getItem('userName');

        return(
            <div>
                {
                    this.state.isLogOut ?
                        <Redirect to="/login" /> :
                        <div className="main-navbar">
                            <Navbar className="navbar-height">
                                <Navbar.Collapse id="basic-navbar-nav">
                                    <NavBarItems />
                                </Navbar.Collapse>
                                <NavDropdown
                                    title={loggedUser}
                                    id="basic-nav-dropdown"
                                    className="nav-anchor nav-dropdown"
                                >
                                    <NavDropdown.Item>Profile</NavDropdown.Item>
                                    <NavDropdown.Item onClick={() => this.handleSingnOutOnclick()}>
                                        Log Out
                                    </NavDropdown.Item>
                                </NavDropdown>
                            </Navbar>
                            <div className="navbar-bottom-line"></div>
                        </div>
                }
            </div>
        );
    }
}

const mapStateToProps = (state) => {
    return {
        user: state.user
    }
}

export default connect(mapStateToProps)(NavBar);



// NavbarItems.js
import React, { Component } from 'react';
import { Nav } from 'react-bootstrap';

import config from '../../config/config';
import MainNavItem from '../NavItem/MainNavItem';

class NavBarItems extends Component {
    getNavItems = () => {
        const navItems = config.navItems;

        return navItems.map((item, i) => {
            return (
                <MainNavItem
                    key={i}
                    currentIndex={i}
                    item={item}
                />
            );
        });
    }

    render() {
        return (
            <Nav className="mr-auto">
                {this.getNavItems()}
            </Nav>
        );
    }
}

export default NavBarItems;



// MainNavItem.js
import React from 'react';
import { NavLink } from 'react-router-dom';

const MainNavItem = (props) => {
    const {
        item,
    } = props;

    return (
        <NavLink
            exact
            to={item.link}
            activeClassName="active-item"
            className="nav-anchor"
        >
            <li key={item.link} >
                <span>{item.text}</span>
            </li>
        </NavLink>
    );
}

export default MainNavItem;

Thanks in advance. 提前致谢。 :) :)

It is because you need to wrap the connect call with withRouter . 这是因为您需要用withRouter包装connect调用。 To do that; 要做到这一点;

npm install compose

import { withRouter } from "react-router-dom";
import compose from "compose";

export default compose(
  withRouter,
  connect(mapStateToProps, mapDispatchToProps)
)(NavBar);

Or you can do it without compose library, but compose library makes the code a little bit more readable as more Higher Order Components come into the component 或者,您也可以在没有compose库的情况下执行此操作,但是随着更多的高阶组件进入组件,compose库使代码更具可读性

export default withRouter(connect(mapStateToProps, mapDispatchToProps)(NavBar));

You can look at the official docs here for why you need to do such a thing 您可以在这里查看官方文档 ,了解为什么需要这样做

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM