小编典典

材质UI-在AppBar上打开LeftNav /抽屉,单击

reactjs

我发现了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;

阅读 249

收藏
2020-07-22

共1个答案

小编典典

在这种情况下,您需要将事件向上传递通过组件,然后再次向下传递。

    <MainNavbar onClickMenu=this.onClickMenu/>
    <LeftNavbar isOpen=this.state.leftNavIsOpen/>

但是,将其与Reactjs结合使用并不是最佳选择,因为LeftNav材质组件不会对属性做出反应,而是会对您所说的方法调用做出反应。

要解决此问题,可以在LeftNav渲染方法中进行检查,以检查当前状态,并在需要时调用toggle()。原则上,这与React的思维方式背道而驰,因为状态包含在特定的子组件内,而不在处理它的DefaultComponent中。

render:function(){
  if(this.props.isOpen){
     LeftNav.open();
  }
  return ...
2020-07-22