2016-08-04 27 views
2

import TestClass from './TestClass'Wie verwandle ich einen String in einen Klassennamen (ohne ihn im Fenster zu definieren)?

Wie kann ich TestClass in dieser Datei die Zeichenfolge 'TestClass' gegeben verweisen?

eval('TestClass') funktioniert nicht, weil TestClass is not defined.

Jedoch, wenn ich let Test = TestClass, und dann eval('Test') mache, gibt es mir den Konstruktor für TestClass zurück, wie gewünscht.

Warum funktioniert eval('TestClass') nicht, wenn eval('Test') funktioniert?

Kontext: Da viele Elemente wie <div data-class="TestClass"></div>, ich möchte eine generische Funktion erstellen, die die entsprechenden in sie reagieren Komponenten macht. Diese Komponentenklassen werden vor Ausführung dieser Funktion in die Datei importiert.

Hinweis: Verwenden Sie Brunch (ähnlich wie Webpack) als Build-System.

+0

Was ist Ihr Paketsystem? Webpack? Browserifizieren? –

+2

Sie sollten Ihre Lösung besser überdenken. Der springende Punkt des neuen Modulsystems ist, dass es statisch analysiert werden kann. Da Sie nicht dynamisch importieren können, ist es nicht sinnvoll, dynamisch zu instanziieren. – zerkms

+0

hilft Ihnen [MDN Dokumentation] (https://developer.mozilla.org/en/docs/web/javascript/reference/statements/import) was Sie erreichen können und was nicht? –

Antwort

2

Ich weiß nicht, was Brunch tut, aber Sie können einfach ein Objekt mit Komponenten nach dem Importieren erstellen und verwenden, um die Komponente mit einer Zeichenfolge abgerufen. Etwas wie:

import TestClass1 from './TestClass1' 
import TestClass2 from './TestClass2' 

const componentMap = { 
    TestClass1: TestClass1, 
    TestClass2: TestClass2 
} 

// You can just use the map to get the component given the name 
const component = componentMap[componentName] 
+0

Danke! Das wird funktionieren. Gibt es einen automatisierten Weg, 'componentMap' zu definieren, wenn' ['TestClass1', 'TestClass2'] ''? –

+0

@AlishanLadhani: Nr. –

+3

@AlishanLadhani 'const componentMap = {TestClass1, TestClass2};' <- das wäre das gleiche, aber ohne Duplizierung. – zerkms