Я создаю компонент React для отображения HTML-формы, и я нахожу необходимость рекурсивно перебирать все дочерние элементы родительского компонента Form, чтобы добавить дополнительные реквизиты только для дочерних компонентов определенного типа.React.Children.map рекурсивно?
Пример (в JSX):
<Form>
<p>Personal Information</p>
<Input name="first_name" />
<Input name="last_name" />
<Input name="email" />
<Label>
Enter Your Birthday
<Input name="birthday" type="date" />
</Label>
</Form>
В этом примере я использую React.Children.map внутри моей форме компоненты, а затем внутри функции карты я проверяю «тип ребенка "и ребенка„type.displayName“, чтобы определить, какой элемент я имею дело с (либо родной HTML-элемент или ReactElement):
var newChildren = React.Children.map(this.props.children, function(child) {
if (is.inArray(child.type.displayName, supportedInputTypes)) {
var extraChildProps = {
alertColor: this.props.alertColor,
displayErrors: this.state.displayErrors
}
return React.cloneElement(child, extraChildProps);
} else {
return child;
}
}.bind(this));
Моя проблема заключается в том, что React.Children.map только неглубоко перебирает это .props.children, и я хотел бы, чтобы он также проверял детей детей детей и т. д. Мне нужно добавить реквизиты только к моим компонентам ввода, чтобы они знали, когда показывать ошибки, и какой цвет выводить сообщение об ошибке, и т. Д. В приведенном выше примере вход дня рождения не получает необходимые реквизиты, потому что это завернутый в компонент Label.
Любой план для React.Children.map должен иметь «рекурсивный» режим или любую другую утилиту, которая может выполнить то, что я пытаюсь сделать?
В конце дня я хотел бы написать одну функцию, которая отображает каждую дочернюю (даже вложенную), чтобы выполнить операцию над ней (в этом случае клонирование).
я понял, способ обойти определенную проблему, которую я пытался решить, поэтому мне больше не нужно реализовывать эту специфическую рекурсивную итерационную функцию, но было бы здорово услышать о возможных путях решить эту проблему у других, которые, возможно, столкнулись с этой необходимостью. – eriklharper
Это проблема, которую вы решаете, избегая проблемы. Использование React.Children.map - это красный флаг, который вы делаете что-то сложное и запутанное. – FakeRainBrigand
Согласовано. Я вижу, что использование компонентов более высокого порядка и/или mixins (временно) и/или что-то вроде глобального хранилища потоков - это способ предотвратить использование этого метода. В моем конкретном варианте использования это был Formsy.Миксин, который пришел мне на помощь, поскольку я смог определить, когда «displayErrors» просто вызвать функцию Formsy mixin isFormSubmitted(), которая решила мою проблему без необходимости клонирования детей с дополнительными реквизитами. – eriklharper