Динамическое вложение компонентов React.js

Я хотел бы создать формат формы гибкий/динамический JSX, который можно визуализировать с помощью React.js. Этот формат должен включать вложенные группы. Группа может содержать другие группы, а также вопросы.

var Group = React.createClass({
    render: function(){
        return (
            <fieldset></fieldset>
        );
    }
});

var Text = React.createClass({
    render: function() {
        return (
            <label>
               <input type="text"/>
           </label>
        );
     }
});

React.render(
    <form>
        <Group>
           <Text/>
        </Group>
        <Text/>
    </form>,
    document.getElementById('container')
);

Я хочу создать:

<form>
    <fieldset>
        <label>
            <input type="text">
        </label>
    </fieldset>
    <label>
        <input type="text">
    </label>
</form>

Однако элемент <fieldset> не заполняется. Результат просто содержит пустой <fieldset>.

Как я должен вставлять компоненты react.js и сохранять гибкость повторного использования компонентов вопросов и групп на корневом и вложенном уровнях?

Ответ 1

Когда вы вставляете элементы React в другие элементы React в JSX, родительский элемент получает символ children, который содержит дочерние элементы. См. Тип реквизита для детей.

Другим способом взглянуть на это является то, что <Group><div></div></Group> является эквивалентом JSX для React.createElement(Group, null, React.createElement('div', null)), который в свою очередь эквивалентен React.createElement(Group, {children: React.createElement('div', null)}).

Итак, в вашем случае компонент Group будет выглядеть так:

var Group = React.createClass({
    render: function(){
        return (
            <fieldset>{this.props.children}</fieldset>
        );
    }
});

Обратите внимание, что реквизиты для детей представляют собой непрозрачную структуру данных (это может быть отдельный элемент или массив элементов в зависимости от ввода), поэтому, если вам когда-либо понадобится манипулировать им, вы должны использовать React.Children.

Ответ 2

Если у кого-то еще есть проблемы с отладкой через это, и на всякий случай, если верхний проголосовавший ответ не работает для них, docs говорят, что User defined components must be capitalized.
Поэтому в вашем случае, если вы импортируете свой контроллер fieldset как fieldset вместо этого, все должно работать нормально.