当前位置: 首页 > 知识库问答 >
问题:

材质UI-点击AppBar打开LeftNav/Drawer

容寒
2023-03-14

我正在发现ReactJS和材质ui(http://material-ui.com/).

我尝试为我的应用程序创建默认模板。我想在单独的组件中使用AppBar和LeftNav(在新版本中重命名为in-Drawer)。

默认情况下,AppBar上有一个菜单按钮。我想用它来打开LeftNav,但我不知道如何调用LeftBarComponent函数来打开它。

我几乎已经了解了如何在组件之间进行通信,但就我而言,我不知道该怎么做,因为没有关于它的文档。我所知道的打开LeftNav元素的唯一方法是使用LeftNav。切换()

http://material-ui.com/#/components/left-nav

谢谢你的帮助。

违约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;

共有3个答案

江瀚昂
2023-03-14

我正在使用React with Material UI,我已经使用AppBar中的onLefticonButtontTouchTap={this.handleToggle}事件完成了这项操作。有关更多详细信息,请参阅官方文档http://www.material-ui.com/#/components/app-酒吧

App.js

import React from 'react';
import AppBar from 'material-ui/AppBar';
import Drawer from 'material-ui/Drawer';
import MenuItem from 'material-ui/MenuItem';  
import { BrowserRouter as Router, Route, Link } from 'react-router-dom'; 
import Dashboard from './Dashboard/dashboard.js';
import Information from './Information/information.js';
import './App.css';

class App extends React.Component {

  constructor(props) {
    super(props);
    this.state = {open: false};
  }

  handleToggle = (event) => this.setState({open: !this.state.open});

  render() {

    const {styleFromProps} = this.props;
    const contentStyle = {  ...styleFromProps, transition: 'margin-left 450ms cubic-bezier(0.23, 1, 0.32, 1)' };

    if (this.state.open) {
      contentStyle.marginLeft = 256;
    }

    return (
        <Router>
          <div>
          <AppBar title="AppTitle" onLeftIconButtonTouchTap={this.handleToggle} />

            <Drawer containerStyle={{height: 'calc(100% - 64px)', top: 64}} docked={true} width={200} open={this.state.open} zDepth={2}>
              <Link to="/dashboard" style={{ textDecoration: 'none' }}><MenuItem>Dashboard</MenuItem></Link>
              <Link to="/information" style={{ textDecoration: 'none' }}><MenuItem>Information</MenuItem></Link>
            </Drawer>

            <Route path="/dashboard" component={(props) => <Dashboard {...props} open={this.state.open}/>} />
            <Route path="/information" component={(props) => <Information {...props} open={this.state.open}/>} />
          </div>
        </Router>
    );
  }
}

export default App;

我想这会对你有帮助。

徐飞尘
2023-03-14

为了澄清steinso所说的,您需要使用Flux架构将事件发送到一个Action,然后在商店中更改它。然后使用EventEmitter分派一个emit change事件。这将在具有更新状态的受影响组件上触发渲染。

https://facebook.github.io/flux/

如果你必须把他们分开,那将是最好的方法。但是,如果您可以将它们放在同一个组件中,例如“主”,那么您可以简单地使用ref属性并引用该组件。

module.exports = React.createClass({

  childContextTypes: {
    muiTheme: React.PropTypes.object
  },

  getChildContext: function() {
    return {
      muiTheme: ThemeManager.getCurrentTheme()
    };
  },

  _toggleNav: function(){
    this.refs.leftNav.toggle();
  },

  render: function() {
    return (
      <div>
        <mui.LeftNav
          ref='leftNav'
          menuItems={menuItems}
          docked={false} />
        <mui.AppBar
          title='Default'
          onLeftIconButtonTouchTap={this._toggleNav} />
      </div>
    );
  }

});

像这样。

杨阳飇
2023-03-14

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

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

然而,将此与Reactjs结合使用并不是最佳的,因为LeftNav材料组件不会对属性做出反应,而是像您所说的那样对方法调用做出反应。

为了解决这个问题,您可以在LeftNav呈现方法中放置一个检查,检查当前状态,并在需要时调用toggle()。原则上,这与React的思维方式相反,因为状态包含在特定的子组件中,而不是处理它的DefaultComponent中。

render:function(){
  if(this.props.isOpen){
     LeftNav.open();
  }
  return ...
 类似资料:
  • 我有两个角材料图标在一个组件,每一个菜单-例如菜单1和菜单2。当我单击menu1图标时,它将打开menu1列表。然后,当我单击menu2图标时,我需要关闭menu1列表并打开menu2。但现在我需要做两次点击来做这个activity。第一次单击关闭menu1,第二次单击打开Menu2。如何使用实现第二个菜单的一键打开? 菜单1 html 菜单2 html 例示有角材料样品。我的问题是如何打开和关闭

  • 从 1.2 版本开始, UI 的 Sprite 组件支持自定义材质的使用,其使用界面如下图: 其使用方法与其他材质并无不同,但由于 Sprite 面板有基于 UI 内置材质的功能,所以有一些需要注意的点: 当设置自定义材质数量为 0 或为空时,会使用默认材质进行渲染,面板功能及使用方法可参考 Sprite UI 并不支持多材质,自定义材质的数量最多为一个 当使用了 ui 自定义材质之后,面板上的

  • Points使用的默认材质。 代码示例 const vertices = []; for ( let i = 0; i < 10000; i ++ ) { const x = THREE.MathUtils.randFloatSpread( 2000 ); const y = THREE.MathUtils.randFloatSpread( 2000 ); const z = THRE

  • 我有一个如下: 然而,所有的标签都向右对齐,我想把它们对齐到中心。使用对象,我可以只传递以属性,但是,它与不一样。 我怎样才能像处理

  • 我想从材质UI更改(减少)工具栏的默认高度 我已经提到了如何更改材质UI工具栏高度?但我仍然面临着这个问题 问题是,当我超过50岁时,我能看到变化。但当我想降低高度时,我无法做到。 我如何才能实现这一点? 我的代码:

  • 一种使用Sprite的材质。 代码示例 const map = new THREE.TextureLoader().load( 'textures/sprite.png' ); const material = new THREE.SpriteMaterial( { map: map, color: 0xffffff } ); const sprite = new THREE.Sprite( ma