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>
);
}
}
Not sure if this is the best way to do this, but it worked, so thought I would leave it in case somebody else got stuck with this.
I ended up getting this to work by moving the specification of the menu items into an array and up to the component that the LeftNav and MenuItems were being rendered in and then binding the index number of the array through the onTouchTap event handler so history.pushState could pull the new route from the menu items.
The other key was to define the history contextType on App component and then make it available in the _handleMenuItemTouchTap function. Here's the complete App component.
MaterialLeftNav.js
App.js