React调用另一个组件

时间:2016-11-25 23:11:01

标签: javascript reactjs ecmascript-6 grommet

我正在使用Grommet,并且当按下按钮时我正试图让Layer(几乎是一个模态)工作。我知道我的onClick工作,因为我尝试了一个简单的console.log,它的工作原理。如果我使用ReactDOM并渲染它,也可以显示MyModal。我认为我的问题与我如何调用它或返回它有关?我希望在单击按钮时显示模态。

MyModal.js

import React, { Component } from 'react';
import Layer from 'grommet/components/Layer';
import Header  from 'grommet/components/Header';
import Heading from 'grommet/components/Heading';
import Section from 'grommet/components/Section';
import Paragraph from 'grommet/components/Paragraph';

export default class MyModal extends Component {  
  render () {
    return (
        <Layer closer={true} align="top">
            <Header>
                <Heading tag="h2">
                    Title
                </Heading>
            </Header>
            <Section>
                <Paragraph>
                    This is a simple dialog.
                </Paragraph>
            </Section>
        </Layer>
    );
  }
};

Main.js

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import App from 'grommet/components/App';
import Button from 'grommet/components/Button';
import MyModal from './components/MyModal';

export default class Main extends Component {
  getComponent(event) {
    return <MyModal/>;
  }
  render () {
    return (
      <App centered={false}>
           <Button onClick={this.getComponent.bind(this)} label="Action" />
      </App>
    );
  }
};

1 个答案:

答案 0 :(得分:1)

问题
您正尝试将模态呈现为内联onClick处理程序。

建议解决方案

  • 设置状态值以便在显示模态时进行处理

  • 设置onClick以切换此值

  • 使用此状态调用渲染中的另一个方法以有条件地渲染模态

您的代码可以修改为:

export default class Main extends Component {
  constructor(props) {
    super(props);
    this.state = {
        showModal: false  // set a value in state to store whether or
                          // not to show the Modal
    };

    // I've just put these binding in the constructor 
    // so as not to clock up the render method and they only
    // get called once during the lifetime of the component
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick(event) {  // switch the value of the showModal state
    this.setState({
      showModal: !this.state.showModal
    });
  }
  getComponent() {
    if (this.state.showModal) {  // show the modal if state showModal is true
      return <MyModal/>;
    } else {
      return null;
    }
  }
  render() {
    return (
      <App centered={false}>
        <Button onClick={this.handleClick} label="Action"/>
{this.getComponent} // call the method to render the modal here. </App> ); } };
/