Я пытаюсь динамически визуализировать компоненты в зависимости от их типа.
Например:
var type = "Example";
var ComponentName = type + "Component";
return <ComponentName />;
// Returns <examplecomponent /> instead of <ExampleComponent />
Я попробовал решение, предложенное здесь React / JSX имена динамических компонентов
Это дало мне ошибку при компиляции (используя browserify для gulp). Он ожидал XML, где я использовал синтаксис массива.
Я мог бы решить эту проблему, создав метод для каждого компонента:
newExampleComponent() {
return <ExampleComponent />;
}
newComponent(type) {
return this["new" + type + "Component"]();
}
Но это будет означать новый метод для каждого компонента, который я создаю. Должно быть более элегантное решение этой проблемы.
Я очень открыт для предложений.
{...this.props}
полезными прозрачную передачу реквизитов в подтиповые компоненты от родителя. Нравитсяreturn <MyComponent {...this.props} />
Официальная документация о том, как справляться с такими ситуациями, доступна здесь: https://facebook.github.io/react/docs/jsx-in-depth.html#choosing-the-type-at-runtime.
В основном это говорит:
Неправильно:
Верный:
источник
Должен быть контейнер, который отображает имена компонентов на все компоненты, которые должны использоваться динамически. Классы компонентов должны быть зарегистрированы в контейнере, потому что в модульной среде нет единого места, где они могли бы быть доступны. Классы компонентов не могут быть идентифицированы по их именам, не указав их явно, потому что функция
name
минимизирована в производстве.Карта компонентов
Это может быть простой объект:
Или
Map
экземпляр:Простой объект является более подходящим, потому что он извлекает выгоду из сокращения свойств.
Ствольный модуль
Модуль ствола с именованным экспортом может действовать как такая карта:
Это хорошо работает с одним классом на стиль кода модуля.
декоратор
Декораторы могут использоваться с компонентами класса для синтаксического сахара, для этого все же необходимо явно указать имена классов и зарегистрировать их в карте:
Декоратор может использоваться как компонент более высокого порядка с функциональными компонентами:
Использование нестандартного
displayName
вместо случайного свойства также способствует отладке.источник
Я разобрался с новым решением. Обратите внимание, что я использую модули ES6, поэтому мне нужен класс. Вместо этого вы также можете определить новый класс React.
источник
default
атрибуту? т.е.: require ('./ ExampleComponent'). default?Если ваши компоненты являются глобальными, вы можете просто сделать:
источник
Components
массив не определен.Для компонента-оболочки простым решением было бы просто использовать
React.createElement
напрямую (используя ES6).источник
Во всех опциях с картами компонентов я не нашел простейшего способа определения карты с использованием короткого синтаксиса ES6:
источник
Наличие карты не выглядит хорошо с большим количеством компонентов. Я на самом деле удивлен, что никто не предложил что-то вроде этого:
Это действительно помогло мне, когда мне нужно было рендерить довольно большое количество компонентов, загруженных в виде массива json.
источник
React.createElement(MyComponent)
напрямую выкинула ошибку. В частности, я не хочу, чтобы родитель должен был знать все компоненты для импорта (в отображении) - потому что это кажется дополнительным шагом. Вместо этого я использовалconst MyComponent = require("path/to/component/" + "ComponentNameString").default; return <MyComponent />
.Возможно, мы хотим получить доступ к различным представлениям с динамической загрузкой компонента. Следующий код дает рабочий пример того, как этого добиться, используя строку, проанализированную из строки поиска URL-адреса.
Предположим, мы хотим получить доступ к странице «snozberrys» с двумя уникальными представлениями, используя следующие URL-пути:
и
мы определяем контроллер нашего представления следующим образом:
источник
Предположим, у нас есть
flag
, ничем не отличается отstate
илиprops
:С флагом
Compo
заполните однимComponentOne
или,ComponentTwo
а затемCompo
может действовать как компонент React.источник
Я использовал немного другой подход, так как мы всегда знаем наши фактические компоненты, поэтому я решил применить случай переключения. Кроме того, общее количество компонентов не было около 7-8 в моем случае.
источник
Изменить: другие ответы лучше, см. Комментарии.
Я решил ту же проблему следующим образом:
источник
React.createElement
он будет вызываться для каждого компонента в вашем поисковом объекте, даже если за один раз визуализируется только один из них. Хуже того, помещая объект поиска вrender
метод родительского компонента, он будет делать это снова каждый раз, когда будет отображаться родительский компонент. Лучшие ответы - намного лучший способ достижения того же самого.