2016-08-08 3 views
1

Ich möchte dynamisch eine react-Komponente von ihrem String-Namen rendern. Hier ist was ich getan habe, aber es funktioniert nicht. Kann das gemacht werden? Ein Beispiel würde wirklich helfen.Wie man eine Reaktionskomponente aus einem String-Namen rendern kann

string_name ist der Name der Komponente.

var MyComponent = React.createElement(window[string_name], {}); 
return (
     <div className="wrapper"> 
      <div>Hello World</div> 
      <MyComponent/> 
     </div> 
    ) 

Antwort

1

Der Schlüssel bisschen fehlt, und ich weiß nicht, ob es irgendwo dokumentiert ist, aber man braucht einen Großbuchstaben für die JSX Compiler verwenden (?) Es als eine Art zu recoginise.

import AllComponents from 'Components'; 

const FooType = 'Foo'; 

return (
    <div className="wrapper"> 
     <div>Hello World</div> 
     <AllComponents[FooType] /> 
    </div> 
); 

Bearbeiten - Gemäß den Kommentaren

class Foo extends React.Component { 
    render() { 
     return <div>Foo 123</div>; 
    } 
}; 

class Bar extends React.Component { 
    render() { 
     return <div>Bar 123</div>; 
    } 
}; 


class App extends React.Component { 


    render() { 
    const all = { 
     'Foo': Foo, 
     'Bar': Bar,  
    }; 

    // For the sake of the demo, just randomly pick one of the two 
    // usually this would come from an import, or something similar 
    const randomKey = ['Foo', 'Bar'][Math.floor(Math.random() * 2)]; 

    // The resolved component must begin with a capital letter 
    const Type = all[randomKey]; 


    return (
     <div> 
      <Type /> 
     </div>  
    ); 
    } 

}; 


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

JSBin: http://jsbin.com/noluyu/5/edit?js,output

bearbeiten 2

Unsere typische Anwendungen, die Komponenten dynamisch machen, in der Regel einen Index haben. Js-Datei an der Wurzel aller Komponenten Verzeichnis, das Sim ple alle möglichen Komponenten auflisten:

// index.js 
export Breadcrumb    from './breadcrumb/Breadcrumb'; 
export Checkbox     from './checkbox/Checkbox'; 
export Comment     from './comment/Comment'; 

alles, was Sie dann ist, wie etwas zu tun haben:

import AllComponents from './index.js'; 

const myType = 'Checkbox'; 
const Type = AllComponents[myType]; 

.. later .. 
return <div><Type /></div>; 
+0

kann nicht Modul ‚Komponenten‘ lösen –

+0

Natürlich müssen Sie eine Liste der verfügbaren Komponenten haben. Ich werde bearbeiten, um ein Inline-Beispiel zu zeigen ... – Chris

+0

Aber ich kann nicht manuell alle Komponenten auflisten. Gibt es eine andere Möglichkeit, dies dynamisch zu tun? –

0

Eine Sache, die Sie tun können innerhalb MyComponent eine untergeordnete Komponente ist erforderlich und es in Ihrer Rückkehr zu machen. Schreiben Sie Ihre benutzerdefinierte Funktion, um die Komponente dynamisch in Child zu rendern, und fordern Sie sie dann in MyComponent an.

var React = require('react'); 

var Names = React.createClass({ 
    render: function(){ 

    // Map the names and loop through 
    var names = this.props.names.map(function(name, index){ 

     return(
      <div> 
       <li className="list-group-item" key={index}> 
        {<h4>{name[index]}</h4>} 

       </li> 
      </div> 
     ) 
    }); 
    } 
}); 

/*We then export the Names component*/ 
module.exports = Names; 

Unten ist die Elternkomponente.

var React = require('react'); 
var Names = require('./Names'); 

var MyComponent = React.createClass({ 
/*This will set the initial state for any state the component handles. usually empty data*/ 
getInitialState: function(){ 
    return { 

     names: ["My Component", "Your Component"] 

    } 
}, 


render: function(){ 

    return(

     <div className="row"> 

      <div className="col-md-4"> 

       <Names names={this.state.names} /> 

      </div> 

     </div> 
    ); 
} 
}); 
+0

Wäre name.name in h4 nicht undefiniert, wenn Sie das flache Array von Strings zuordnen? – Chris

+0

Hier ist eine Arbeitsgeige, die den Komponentennamen dynamisch auswählt. Wenn ich einige andere HTML-Tags vor Tag schreibe, funktioniert es nicht. jsfiddle.net/geetamamuni/q3zwtosw/19 –

+0

@GeetanjaliPanda Ehrlich gesagt gibt es mehr praktische Möglichkeiten, um das Problem zu lösen. In Ihrer Geige rendern Sie schließlich eine Komponente für das Fenster. Du solltest Daten als Requisiten vom Elternteil an das Kind oder Besitzer an das Eigene weitergeben, das ist der React-Weg. Dann können Sie jede benutzerdefinierte Funktion schreiben, um die Daten dynamisch anzeigen zu lassen. – vincentjp

Verwandte Themen