次のReact.jsコードは、「about」と「project」という名前の2つのリンクを持つナビゲーションバーをレンダリングします。ページの読み込み時に、「about」リンクがアクティブになり、赤色になります。他のリンクをクリックすると、ナビゲーションバーの状態が「プロジェクト」に設定され、「約」リンクスタイルが元に戻り、「プロジェクト」が赤になります。
これを実現するには、両方のリンクタグにクリックハンドラーをアタッチし、アクティブの状態をevent.target.innerHTMLの名前に設定します。
私は反応するのが初めてで、これは本当に冗長な方法だと思います。 react-routerリンクに渡すことができるactiveClassNameプロップがあることは知っていますが、それを使用しない方法が必要です。
import React, { Component } from 'react'
import { Link, Route } from 'react-router'
export default class Navbar extends Component {
constructor() {
super();
this.state = {
active: 'about'
}
this._handleClick = this._handleClick.bind(this);
}
_handleClick(e) {
this.setState({
active: e.target.innerHTML
});
}
render() {
let aboutStyle;
let projectStyle;
if (this.state.active === 'about') {
aboutStyle = { color: '#ff3333' };
projectStyle = {};
} else {
aboutStyle = {};
projectStyle = { color: '#ff3333' };
}
return (
<div className='navbar'>
<Link to='/'><h2>BK //</h2></Link>
<div className='menu'>
<Link style={aboutStyle} onClick={this._handleClick} to='about'>about</Link>
<Link style={projectStyle} onClick={this._handleClick} to='projects'>projects</Link>
</div>
</div>
)
}
}
多分少し冗長ではない...擬似コードで
const menuItems = [
'projects',
'about',
];
class MenuExample extends React.Component {
_handleClick(menuItem) {
this.setState({ active: menuItem });
}
render () {
const activeStyle = { color: '#ff3333' };
return (
<div className='menu'>
{menuItems.map(menuItem =>
<Link
style={this.state.active === menuItem ? activeStyle : {}}
onClick={this._handleClick.bind(this, menuItem)}
>
{menuItem}
</Link>
)}
</div>
);
}
}
この日、react-router-domからNavLinkを使用できます
import { NavLink } from 'react-router-dom';
<NavLink>
activeClassName="active"
//if you use deep routes
exact
</NavLink>