[英]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.