2017-03-15 73 views
0

我正在構建一個帶有ReactJS和Semantic-UI的Meteor應用程序以進行反應。嘗試爲顯示爲模式的新項目創建窗體時遇到問題。我收到以下錯誤。類型無效 - 預期爲字符串

Warning: React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in. Check the render method of `App`. 

App.jsx文件:

import React, { Component, PropTypes } from 'react'; 
import { createContainer } from 'meteor/react-meteor-data'; 

import { Items } from '../api/items.js'; 

import { Item } from './Item.jsx'; 
import { ItemFormModal } from './ItemFormModal.jsx'; 

// App component - represents the whole app 
export class App extends Component { 

    renderItems() { 
    return this.props.items.map((item) => (
     <Item key={item._id} item={item} /> 
    )); 
    } 

    render() { 
    return (
     <div className="container"> 
     <header> 
      <h1>Products</h1> 

      <ItemFormModal /> 
     </header> 

     <ul className="collection"> 
      {this.renderItems()} 
     </ul> 
     </div> 
    ); 
    } 
} 


App.propTypes = { 
    items: PropTypes.array.isRequired, 
}; 


// creates container on client side for the collection 
export default createContainer(() => { 
    return { 

    // fetch all the items available 
    items: Items.find({}, { sort: { createdAt: -1 } }).fetch(), 
    }; 
}, App); 

編輯:我已經改變,以反映整個ItemFormModal.jsx:

import { Items } from '../api/items.js'; 

import React, { Component, PropTypes } from 'react'; 
import ReactDOM from 'react-dom'; 

// Import all semantic resources 
import { Button, Icon, Header, Form, Modal } from 'semantic-ui-react'; 


export default class ItemFormModal extends React.Component { 

    constructor(props) { 
     super(props); 

     this.state = { 
      title: "", 
      price: 0.00, 
      modalOpen: false 
     } 


     this.handleOpen = this.handleOpen.bind(this); 
     this.handleClose = this.handleClose.bind(this); 
     this.handleInputChange = this.handleInputChange.bind(this); 
     this.handleSubmit = this.handleSubmit.bind(this); 
    } 

    handleOpen(event) { this.setState({ modalOpen: true }) } 

    handleClose(event) { this.setState({ modalOpen: false }) } 

    handleInputChange(event) { 
     const target = event.target; 
     const value = target.type === "checkbox" ? target.checked : target.value; 
     const name = target.name; 

     this.setState({ 
     [name]: value 
     }); 
    } 

    handleSubmit(event) { 
     event.preventDefault(); 

     let title = this.state.title.trim(); 
     let price = this.state.price; 

     Items.insert({ 
     title: title, 
     price: price, 
     recurring: false, 
     createdAt: new Date(), // current time 
     }); 

     this.setState({ 
     title: "", 
     price: 0.00 
     }); 
    } 

    render() { 
     return (
      <div id="new-item"> 
       <Button onClick={this.handleOpen}>Create</Button> 
       <Modal 
        open={this.state.modalOpen} 
        onClose={this.handleClose} 
        size="small" 
        closeIcon="close"> 
        <Modal.Header>Create new item</Modal.Header> 

        <Modal.Content> 
         <Form> 
          <Form.Group> 
           <Form.Input name="title" label="Title" placeholder="Title" value={this.state.title} onChange={this.handleInputChange}/> 
           <Form.Input name="price" label="Price" placeholder="Price" value={this.state.price} onChange={this.handleInputChange} /> 
          </Form.Group> 
         </Form> 
        </Modal.Content> 
        <Modal.Actions> 
         <Button className="negative" onClick={this.handleClose}>Cancel</Button> 
         <Button className="positive" onClick={this.handleSubmit}>Create</Button> 
        </Modal.Actions> 

       </Modal> 
      </div> 
     ) 
    } 


} 

任何幫助,不勝感激!

+0

由於錯誤消息提示「您可能忘記將組件從其定義的文件中導出」。你導出你的組件? – hackjutsu

+0

@Hackjutsu是的,我有這個爲我的類'出口默認類ItemFormModal擴展React.Component' – Cameron

+0

請發佈您的ItemFormModal完整的代碼請 – sfratini

回答

4

您正在錯誤地導入到App.jsx中。你有這個:

import { ItemFormModal } from './ItemFormModal.jsx'; 

......如果你的出口被標記爲默認,這將不起作用。您可以從您的導出中刪除「默認」,或者您可以將導入更改爲:

import ItemFormModal from './ItemFormModal.jsx'; 
+0

這解決了我所有的問題,謝謝! – Cameron

相關問題