2016-12-25 105 views
2

我的目标是在多个组件中重复使用模态。我有一个问题,我怎样才能将组件传递给容器?如何将组件对象传递给React.js中的容器?

<ModalContainer 
     title="Password recovery" 
     body="<LoginRecoverForm someprophere='' />" 
    /> 

这给出了一个错误:

Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object. Check the render method of `ModalLoginRecover`. 

下面是简单的容器:

import { Modal } from 'react-bootstrap/lib/' 
var React = require('react') 

var ModalContainer = React.createClass({ 

    getInitialState() { 
    return { showModal: true }; 
    }, 

    close() { 
    this.setState({ showModal: false }); 
    browserHistory.push('/login'); 
    }, 

    open() { 
    this.setState({ showModal: true }); 
    }, 

    render: function() { 
    return (
    <div> 
     <Modal show onHide={this.close}> 

     <Modal.Header closeButton> 
      <Modal.Title>{this.props.title}</Modal.Title> 
     </Modal.Header> 

     <Modal.Body> 
      {this.props.body} 
     </Modal.Body> 

     </Modal> 
    {this.props.children} 
    </div> 
)}}); 

module.exports = ModalContainer; 

下面是简单的组件:

import {Modal, HelpBlock, FormGroup, Button, FormControl } from 'react-bootstrap/lib/' 
var React = require('react'); 
import { Router, ReactRouter, browserHistory } from 'react-router'; 

var ModalContainer = require('../../containers/ModalDialog') 

function FieldGroup({ id, help, type, placeholder }) { 
    return (
    <FormGroup controlId={id}> 
     <FormControl type={type} placeholder={placeholder} /> 
     {help && <HelpBlock>{help}</HelpBlock>} 
    </FormGroup> 
); 
} 

function LoginRecoverForm(){ 

    return (
    <form method="POST" action=""> 
    <FieldGroup 
     id="formControlsEmail" 
     type="email" 
     placeholder="Enter your E-mail" 
    /> 

    <Button type="submit">Recover!</Button> 

    </form> 
)}; 

var ModalLoginRecover = React.createClass({ 
    render: function() { 
     return (
      <div> 
       <ModalContainer 
       title="Password recovery" 
       body="<LoginRecoverForm someprophere='' />" 
       /> 
      </div> 
)}}); 

module.exports = ModalLoginRecover; 
+0

不是100%熟悉反应,但不能这样做'体= { }'? – blockhead

+0

@blockhead ok对不起,你是对的,发表一个答案,我会把它标记为已解决。问题出现在另一个地方。但我仍然需要这个答案。谢谢! :) – holms

回答

1

由于JSX只是JavaScript中,你可以把它当作道具,就像任何JS表达:

<ModalContainer 
    title="Password recovery" 
    body={<LoginRecoverForm someprophere=""/>} 
/> 
1

你可以做的是通过组件作为像这样的孩子:

<ModalContainer 
     title="Password recovery" 
     body=""><LoginRecoverForm someprophere='' /> 
</ModalContainer> 

阵营将投入LoginRecoveryForm组件在{this.props.children}的地方在ModalContainer

+0

很伤心,你还不能评论。我只是想把它放在'this.props.body'里,而我想要有多个组件的多个道具? – holms

2

尝试:

<ModalContainer 
     title="Password recovery" 
     body={(() => {return <LoginRecoverForm someprophere='' />})()} 
    /> 
+0

警告:React.createElement:类型不应该为null,undefined,boolean或number。它应该是一个字符串(用于DOM元素)或ReactClass(用于复合组件)。检查'ModalLoginRecover'的渲染方法。 index_bundle.js:8887:10 错误:元素类型无效:预期为字符串(对于内置组件)或类/函数(对于复合组件),但得到:object。检查'ModalLoginRecover'的渲染方法。 – holms