使用 React 路由器当前路由在菜单上有条件地设置活动 class
Conditionally set active class on menu using react router current route
我正在使用 React 路由器 1.0.2,我的路由如下所示:
ReactDOM.render(
<Provider store={store}>
<Router history={history}>
<Route path="/" component={App}>
<IndexRoute component={Home}/>
<Route path="triangles" component={Triangles}/>
</Route>
</Router>
</Provider>,
document.querySelector('.container')
);
我的 App 组件看起来像这样,我想我可以在 props 中传递位置:
import React, {Component} from 'react';
import Menu from './menu';
export default class App extends Component {
render() {
return (
<div>
<Menu/>
<div className="jumbotron">
{this.props.children && React.cloneElement(this.props.children, {
location: this.props.location
})}
</div>
</div>
);
}
};
我想有条件地在菜单组件上设置活动 class:
import React, {Component} from 'react';
import { pushPath } from 'redux-simple-router';
import { Link } from 'react-router';
export default class Menu extends Component {
render() {
return (
<nav role="navigation" className="navbar navbar-default">
<div id="navbarCollapse" className="collapse navbar-collapse">
<ul className="nav navbar-nav">
<li className={this.props.location.pathname === '/' ? 'active' : ''}>
<Link to="/">Home</Link>
</li>
</ul>
</div>
</nav>
);
}
};
但是调用菜单的render函数时this.props.location
为null?
如何将 props 传递给子组件?
您似乎没有将 prop 传递到正确的元素中。 App
的 children
将是正在呈现的任何子路由(因此 Home
或 Triangles
),但您希望将道具传递给 Menu
.
为此,只需通过 JSX 将其传入:
import React, {Component} from 'react';
import Menu from './menu';
export default class App extends Component {
render() {
return (
<div>
<Menu location={this.props.location} />
<div className="jumbotron">
{this.props.children}
</div>
</div>
);
}
};
您需要使用 React Router 的 <NavLink>
组件,它允许您定义样式或在 link 处于活动状态时添加 class。只需将 activeClassName
或 activeStyle
属性设置为您的 <NavLink>
组件。
这是内置于 React Router 中的,请参阅官方文档以获取更多详细信息:https://reacttraining.com/react-router/web/api/NavLink
在活动导航元素上设置 class
import { NavLink } from 'react-router-dom';
&
<NavLink to="/Home" activeClassName="active">Home</NavLink>
对我来说有用的是使用 NavLink
因为它有这个活动 class 属性.
先导入
import { NavLink } from 'react-router-dom';
使用 activeClassName
获取活动 class 属性.
<NavLink to="/" activeClassName="active">
Home
</NavLink>
<NavLink to="/store" activeClassName="active">
Store
</NavLink>
<NavLink to="/about" activeClassName="active">
About Us
</NavLink>
通过 属性 active
.
在 css 中设置您的 class 样式
.active{
color:#fcfcfc;
}
我正在使用 React 路由器 1.0.2,我的路由如下所示:
ReactDOM.render(
<Provider store={store}>
<Router history={history}>
<Route path="/" component={App}>
<IndexRoute component={Home}/>
<Route path="triangles" component={Triangles}/>
</Route>
</Router>
</Provider>,
document.querySelector('.container')
);
我的 App 组件看起来像这样,我想我可以在 props 中传递位置:
import React, {Component} from 'react';
import Menu from './menu';
export default class App extends Component {
render() {
return (
<div>
<Menu/>
<div className="jumbotron">
{this.props.children && React.cloneElement(this.props.children, {
location: this.props.location
})}
</div>
</div>
);
}
};
我想有条件地在菜单组件上设置活动 class:
import React, {Component} from 'react';
import { pushPath } from 'redux-simple-router';
import { Link } from 'react-router';
export default class Menu extends Component {
render() {
return (
<nav role="navigation" className="navbar navbar-default">
<div id="navbarCollapse" className="collapse navbar-collapse">
<ul className="nav navbar-nav">
<li className={this.props.location.pathname === '/' ? 'active' : ''}>
<Link to="/">Home</Link>
</li>
</ul>
</div>
</nav>
);
}
};
但是调用菜单的render函数时this.props.location
为null?
如何将 props 传递给子组件?
您似乎没有将 prop 传递到正确的元素中。 App
的 children
将是正在呈现的任何子路由(因此 Home
或 Triangles
),但您希望将道具传递给 Menu
.
为此,只需通过 JSX 将其传入:
import React, {Component} from 'react';
import Menu from './menu';
export default class App extends Component {
render() {
return (
<div>
<Menu location={this.props.location} />
<div className="jumbotron">
{this.props.children}
</div>
</div>
);
}
};
您需要使用 React Router 的 <NavLink>
组件,它允许您定义样式或在 link 处于活动状态时添加 class。只需将 activeClassName
或 activeStyle
属性设置为您的 <NavLink>
组件。
这是内置于 React Router 中的,请参阅官方文档以获取更多详细信息:https://reacttraining.com/react-router/web/api/NavLink
在活动导航元素上设置 class
import { NavLink } from 'react-router-dom';
&
<NavLink to="/Home" activeClassName="active">Home</NavLink>
对我来说有用的是使用 NavLink
因为它有这个活动 class 属性.
先导入
import { NavLink } from 'react-router-dom';
使用
activeClassName
获取活动 class 属性.<NavLink to="/" activeClassName="active"> Home </NavLink> <NavLink to="/store" activeClassName="active"> Store </NavLink> <NavLink to="/about" activeClassName="active"> About Us </NavLink>
通过 属性
在 css 中设置您的 class 样式active
..active{ color:#fcfcfc; }