2016-08-04 3 views
2

import TestClass from './TestClass'Как превратить строку в имя класса (без определения его в окне)?

Как я ссылаться TestClass в этом файле заданной строки 'TestClass'?

eval('TestClass') не работает, поэтому TestClass is not defined.

Однако, если я делаю let Test = TestClass, а затем eval('Test'), он возвращает мне конструктор для TestClass, по желанию.

Почему eval('TestClass') не работает, если eval('Test')?

Контекст: Учитывая многие элементы, такие как <div data-class="TestClass"></div>, я хочу создать обобщенную функцию, которая делает соответствующий Реагировать компонентов в них. Эти классы компонентов будут импортированы в файл перед выполнением этой функции.

Примечание: Использование Brunch (аналогично webpack) в качестве системы сборки.

+0

Какая у вас система упаковки? Webpack? Browserify? –

+2

Лучше пересмотреть свое решение. Весь смысл новой модульной системы - это то, что ее можно статически анализировать. Поскольку вы не можете «импортировать» динамически - нет большого смысла динамически создавать экземпляры. – zerkms

+0

делает [документация по MDN] (https://developer.mozilla.org/en/docs/web/javascript/reference/statements/import) поможет вам с тем, что вы можете и чего не можете достичь? –

ответ

2

Я не знаю, что делает Brunch, но вы можете просто создать объект с компонентами после импорта и использовать его для извлечения компонента с учетом строки. Что-то вроде:

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

Спасибо! Это сработает. Есть ли какой-либо автоматизированный способ определения 'componentMap' данных' ['TestClass1', 'TestClass2'] '? –

+0

@AlishanLadhani: № –

+3

@AlishanLadhani 'const componentMap = {TestClass1, TestClass2};' <- это будет то же самое, но без дублирования. – zerkms