我发现了ReactJS和material-ui(http://material-ui.com/)。
我尝试为我的应用程序创建一个默认模板。我想在分离的组件中使用AppBar和 LeftNav(在新版本的Drawer中重命名) 。
默认情况下,AppBar上具有菜单按钮。我想用它打开LeftNav,但是我不知道如何调用LeftBarComponent组件函数来打开它。
我几乎了解如何在组件之间进行通信,但是就我而言,我不知道该怎么做,因为没有关于它的文档。我唯一知道打开LeftNav元素的方法是使用LeftNav.toggle()
http://material-ui.com/#/components/left-nav
谢谢你的帮助。
Default.jsx
use strict'; var React = require('react'); var pageStore = require('../../stores/page'); var MainNavbar = require('../modules/navbar.jsx'); var LeftNavbar = require('../modules/leftbar.jsx'); var getState = function() { return { title: pageStore.get().title }; }; var DefaultComponent = React.createClass({ mixins: [pageStore.mixin], componentDidMount: function() { pageStore.emitChange(); }, getInitialState: function() { return getState(); }, render: function() { return ( /* jshint ignore:start */ <div className="main-container"> <MainNavbar /> <LeftNavbar /> <div className="content"> {this.props.children} </div> </div> /* jshint ignore:end */ ); }, // Event handler for 'change' events coming from store mixins. _onChange: function() { this.setState(getState()); } }); module.exports = DefaultComponent;
navbar.jsx
'use strict'; var React = require('react'); var routeActions = require('../../actions/routes'); var MUI = require('material-ui'); var AppBar = MUI.AppBar; // Navbar Component // Application main menu // Usage: <Navbar /> var NavbarComponent = React.createClass({ render: function() { return ( /* jshint ignore:start */ <AppBar title="MyApp" onMenuIconButtonTouchTap={ this._handleClick }> <div className="clear"></div> </AppBar> /* jshint ignore:end */ ); }, _handleClick: function() { console.log('ok'); } }); module.exports = NavbarComponent;
leftbar.jsx
'use strict'; var React = require('react'); var routeActions = require('../../actions/routes'); var MUI = require('material-ui'); var LeftNav = MUI.LeftNav; var MenuItem = MUI.MenuItem; var menuItems = [ { route: 'home', text: 'Home' }, { route: 'about', text: 'About' }, ]; // LeftBar Component // Application left menu // Usage: <LeftBar /> var LeftBarComponent = React.createClass({ render: function() { return ( /* jshint ignore:start */ <LeftNav menuItems={menuItems} docked={false} /> /* jshint ignore:end */ ); }, _handleClick: function() { console.log('ok'); } }); module.exports = LeftBarComponent;
在这种情况下,您需要将事件向上传递通过组件,然后再次向下传递。
<MainNavbar onClickMenu=this.onClickMenu/> <LeftNavbar isOpen=this.state.leftNavIsOpen/>
但是,将其与Reactjs结合使用并不是最佳选择,因为LeftNav材质组件不会对属性做出反应,而是会对您所说的方法调用做出反应。
要解决此问题,可以在LeftNav渲染方法中进行检查,以检查当前状态,并在需要时调用toggle()。原则上,这与React的思维方式背道而驰,因为状态包含在特定的子组件内,而不在处理它的DefaultComponent中。
render:function(){ if(this.props.isOpen){ LeftNav.open(); } return ...