I am having trouble getting this to work. I'm trying to get the material ui leftNav to work with react router and redux with nav going through the store and router. This was close, but didn't get all the way to the menu item.
TypeError: Cannot read property 'isActive' of undefined
I was also referring to these examples: https://github.com/callemall/material-ui/blob/master/docs/src/app/components/app-left-nav.jsx
http://codetheory.in/react-integrating-routing-to-material-uis-left-nav-or-other-components/
Here is the component I'm working on. I started with react-redux-universal-hot-example. This component is going into the App component.
import React, { Component } from 'react';
import LeftNav from 'material-ui/lib/left-nav';
import RaisedButton from 'material-ui/lib/raised-button';
const menuItems = [
{ route: '/widgets', text: 'Widgets' },
{ route: 'survey', text: 'Survey' },
{ route: 'about', text: 'About' }
];
export default class MaterialLeftNav extends Component {
static propTypes = {
history: React.PropTypes.object
}
static contextTypes = {
location: React.PropTypes.object,
history: React.PropTypes.object
}
contructor(props) {
super(props);
}
_onLeftNavChange(e, key, payload) {
this.props.history.pushState(null, payload.route);
}
_handleTouchTap() {
this.refs.leftNav.toggle();
}
_getSelectedIndex() {
let currentItem;
for (let i = menuItems.length - 1; i >= 0; i--) {
currentItem = menuItems[i];
if (currentItem.route && this.props.history.isActive(currentItem.route)) return i;
}
}
render() {
return (
<div>
<LeftNav
ref="leftNav"
docked
menuItems={menuItems}
selectedIndex={this._getSelectedIndex()}
onChange={this._onLeftNavChange}
/>
<RaisedButton label="Toggle Menu" primary onTouchTap={this._handleTouchTap} />
</div>
);
}
}
Just to add another comment: I'm using React v.14 and React Router 1.0 and found this to make routing work nicely with my application. It looks like the React Router api changed for this stuff from
Navigation
to theHistory
object. I fought with this for a while and after realizing that I'm using ES6 classes (no mixins allowed) and Router v1.0, this is a way to make it work. Some of this was inspired by @CalebEverett above (so, thank you!). A main difference is I've added theHistory
object to theNavigation
(my component, not to be confused with React Router) context.My app looks like: