2017-02-06 5 views
0

Ich versuche dynamische Codeaufteilung mit Webpack 2 zu implementieren und zu reagieren. Um zu testen, habe ich eine Komponente erstellt, die asynchron in Code zieht:Warum reagiert diese Komponente, die mit System.import importiert wurde, nicht?

import React, { Component } from 'react' 

export class Async extends Component { 
    constructor(props) { 
    super(props) 
    this.state = { component: <div>Loading</div> } 
    } 

    componentDidMount() { 
    System.import('../../about') 
     .then(component => this.setState({ component: component.About })) 
     .catch(error => this.setState({ component: <div>{error.message}</div> })) 
    } 

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

Allerdings, wenn ich es montieren, es gibt den folgenden Fehler:

Async.render(): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object. 

Einlochen console.log (this.state .component) in Async ‚s-Funktion ergibt sich folgende render:

enter image description here

So falsch hier, was los ist? Es scheint, als würde ich gültige Reaktionskomponenten erhalten, warum wirft es einen Fehler auf?

+0

Sollte 'importieren Reagieren, {Komponente} von 'reagieren'' nicht 'importieren {Reagieren, Komponente} von 'reagieren'? – evolutionxbox

+0

@evolutionxbox Nein, Reagieren ist der Standard-Export des Pakets 'react' – vsjn3290ckjnaoij2jikndckjb

Antwort

1

Sie geben die Komponentenklasse zurück, wenn Sie sollten tatsächlich ein Element zurückgegeben von dieser Klasse zurückgeben. Sie sind nicht das Gleiche!

// Replace this: 

render() { 
    return this.state.component 
} 

// With this: 

render() { 
    return <this.state.component /> 
} 

// Or this: 

render() { 
    return React.createElement(this.state.component) 
} 
+1

Das funktioniert nicht, da this.state.component nicht immer eine Klasse ist. Aber '.then (component => this.setState ({component: React.createElement (component.About)})) löst es. Vielen Dank! – vsjn3290ckjnaoij2jikndckjb

+0

@ismay: Guter Punkt! –

0

Ich glaube, Sie this.state.component innerhalb {} wickeln müssen und eine <div> und dass das, was der Fehler über

ist

Sie benötigen ein Element aus dem Bauteil

class Async extends React.Component { 
 
    constructor(props) { 
 
    super(props); 
 
    this.state = { 
 
     component: React.createElement('div', {}, "loading") 
 
    } 
 
    } 
 
    render() { 
 
    return (
 
     this.state.component 
 
    ) 
 
    } 
 

 
} 
 

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

class Async extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     component: React.createElement('div', {}, "loading") 
    } 
    } 
componentDidMount() { 
    System.import('../../about') 
     .then(component => this.setState({ component: React.createElement(component.About) })) 
     .catch(error => this.setState({ component: React.createElement('div', {}, error.message) })) 
    } 
    render() { 
    return (
     this.state.component 
    ) 
    } 

} 
erstellen
+0

Werfen Sie einen Blick auf meine aktualisierte Antwort –

Verwandte Themen