React-router isActive 方法不起作用

React-router isActive method does not work

我使用 es6twitter bootstrapreact-router 1.0.0-rc3。我想创建一个导航栏并添加到 li 元素 class active.

我尝试使用 history 对象的 isActive 方法。

var RouterPropTypes = require('react-router').PropTypes;

LinkWrapper 组件

export class LinkWrapper extends React.Component{

  constructor(props, context) {
      super(props, context);
  }

  render() {
    console.log(this.props.to);
    console.log(this.props.query);
    let isActive = this.context.history.isActive(this.props.to, this.props.query);
    let className = isActive ? 'active' : '';
    return (<li className={className}>
                <CustomersIcon />
                <Link {...this.props}/>
            </li>);
  }
}

LinkWrapper.contextTypes = {
  history: RouterPropTypes.history
};

导航栏组件

export class NavBar extends React.Component {

  constructor(props, context) {
      super(props, context);
  }

  componentDidUpdate() {
      console.log('NavBar - componentDidUpdate');
    }

  render() {
    return (
        <nav className="navbar navbar-default">
            <div className="collapse navbar-collapse" id="main-navbar-collapse">
              <ul className="nav navbar-nav">
                  <LinkWrapper href="customers" />
              </ul>
            </div>
      </nav>
    );     
  }
}

NavBar.contextTypes = {
  history: RouterPropTypes.history
}

在线this.context.history.isActive我得到错误:

Uncaught TypeError: Cannot read property 'match' of undefined 

因为this.props.tothis.props.query'undefined'

我也尝试用 History Mixin 在 es5 中创建 LinkWrapper 组件,但是 this.props.to 和 this.props.query 仍然是 'undefined'。

var Router = require('react-router');
var { Route, DefaultRoute, RouteHandler, Link, History } = Router;

const Tab = React.createClass({
  mixins: [ History ],
  render() {
    console.log(this.props.to);
    console.log(this.props.query);
    let isActive = this.history.isActive(this.props.to, this.props.query);
    let className = isActive ? 'active' : '';
    return (<li className={className}>
                <CustomersIcon />
                <Link {...this.props}/>
            </li>);
  }
});

使用活动 class 名称

<Link ... activeClassName="active" />

如果要使用this.props.history,则必须设置历史记录

// create browser history for navigating
import createBrowserHistory from 'history/lib/createBrowserHistory';
let history = createBrowserHistory();

然后将 history 属性添加到路由器

<Router history={history}>
    <Route component={App} path="/">
        <Route component={indexView} path="/index" />
    </Route>
</Router>

然后在像 indexView 这样的组件中你可以这样做

this.props.history.isActive('/someroute')