2017-06-09 4 views
3

Ich habe ein Problem mit React, wenn ich versuche, die Seite über die Schaltfläche (aber) die Konsole gibt mirElementtyp ist ungültig: erwartet eine Zeichenfolge (für integrierte Komponenten) oder eine Klasse/Funktion React Error

Elementtyp ist ungültig: erwartet eine Zeichenfolge (für integrierte Komponenten) oder> eine Klasse/Funktion (für zusammengesetzte Komponenten), aber erhalten: undefiniert. Sie> vergessen haben wahrscheinlich Ihre Komponente aus der Datei zu exportieren in.

definiert ist, aber wenn ich die onClick Code in der Klasse Code setzen es zeigt den jsx Code. So funktioniert es, aber warum bekomme ich immer noch den Fehler? Hier ist mein Code:

import React from 'react'; 
import {render} from 'react-dom'; 

//sass 
require('../sass/style.scss'); 

var pages = ['Qrscan']; 
var jsx = [<Qrscan />]; 

class App extends React.Component { 
    constructor (props) { 
     super(props); 
     this.state = {target: <Menu />}; 
     App.changePage = App.changePage.bind(this); 
    } 

    static changePage (tar) { 
     this.setState({target: tar}); 
    } 

    render() { 
     return (
      this.state.target 
     ) 
    } 
} 


//Rendering 
class Menu extends React.Component { 
    render() { 
     return (
      <div id="root"> 
       <Header /> 
       <div className="container"> 
        <But target="Qrscan" class="button button-QR" text="Use QR code" type="button" linkTo="" /> 
        <But class="button button-URL" text="Use URL" type="button" /> 
       </div> 
      </div> 
     ) 
    } 
} 

class Qrscan extends React.Component { 
    render() { 
     return (
      <h1>test</h1> 
     ) 
    } 
} 

//elements 
class Header extends React.Component { 
    render() { 
     return (
      <div className="header"> 
       <div className="header-logo">Jukey</div> 
      </div> 
     ) 
    } 
} 

class But extends React.Component { 
    getInfo() { 
     for (var i = 0; i < pages.length; i++) { 
      if(pages[i] == this.props.target) { 
       return jsx[i]; 
      } 
     } 
    } 

    render() { 
     return (
      <button onClick={() => App.changePage(this.getInfo())} className={this.props.class}>{this.props.text}</button> 
     ) 
    } 
} 

render (<App />, document.getElementById('app')); 

Danke, dass Sie sich die Zeit genommen haben, mir bei meinen Problemen zu helfen!

+0

Ist das alles in einer Datei auch post die letzten Satz des Fehlers, wie in "überprüfen Sie die Render-Funktion von ..." – Li357

+0

@AndrewLi ja, das ist alles in einer Datei und das ist alles, was ich bekomme den Fehler alle anderen Dinge sind Weiterleitungen nichts wie Sie sagten –

Antwort

6

ES6 Klassendeklarationen sind not hoisted.

In Ihrer zweiten Zeile, als Sie var jsx = [<Qrscan />]; definiert haben, ist dieses Element tatsächlich . Wenn ich den Inhalt des jsx Array aus, erhalte ich:

Object {$$typeof: Symbol(react.element), type: undefined, key: null, ref: null, props: Object…} 

So einfach Sie, dass jsx Array-Deklaration zu nach Ihre <Qrscan> Komponentendeklaration zu verschieben haben.

Siehe folgende JSFiddle für das Update und sehen Sie selbst, dass es funktioniert nach der Erklärung, um Verschiebung (?:

var pages = ['Qrscan']; 
 

 
//Rendering 
 
class Menu extends React.Component { 
 
    render() { 
 
     return (
 
      <div id="root"> 
 
       <Header /> 
 
       <div className="container"> 
 
        <But target="Qrscan" class="button button-QR" text="Use QR code" type="button" linkTo="" /> 
 
        <But class="button button-URL" text="Use URL" type="button" /> 
 
       </div> 
 
      </div> 
 
     ) 
 
    } 
 
} 
 

 
class App extends React.Component { 
 
    constructor (props) { 
 
     super(props); 
 
     this.state = {target: <Menu />}; 
 
     App.changePage = App.changePage.bind(this); 
 
    } 
 

 
    static changePage (tar) { 
 
     this.setState({target: tar}); 
 
    } 
 

 
    render() { 
 
     return (
 
      this.state.target 
 
     ) 
 
    } 
 
} 
 

 
class Qrscan extends React.Component { 
 
    render() { 
 
     return (
 
      <h1>test</h1> 
 
     ) 
 
    } 
 
} 
 

 
var jsx = [<Qrscan />]; 
 

 
//elements 
 
class Header extends React.Component { 
 
    render() { 
 
     return (
 
      <div className="header"> 
 
       <div className="header-logo">Jukey</div> 
 
      </div> 
 
     ) 
 
    } 
 
} 
 

 
class But extends React.Component { 
 
    getInfo() { 
 
     for (var i = 0; i < pages.length; i++) { 
 
      if (pages[i] == this.props.target) { 
 
       return jsx[i]; 
 
      } 
 
     } 
 
    } 
 

 
    render() { 
 
     return (
 
      <button onClick={() => App.changePage(this.getInfo())} className={this.props.class}>{this.props.text}</button> 
 
     ) 
 
    } 
 
} 
 

 
ReactDOM.render (<App />, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="app"> 
 
</div>

Verwandte Themen