就我而言,我尝试创建一个简单的表单组件 - 主要用于“测试” reactjs 并使用它。
为此,我使用 2 个组件。第一个组件是父组件,即“表单”组件。第二个组件是表单的字段 - 例如一个简单的文本字段。这是它看起来像的标记:
<Form
schema={MyFormSchema}
>
<Input name="name" />
<Input name="age" />
</Form>
在 MyFormSchema 中,我拥有每个“输入”类型的孩子所需的所有信息。对于这种情况,我在“表单”组件中完成了此操作:
表单.jsx
Form = React.createClass({
renderChildren() {
return React.Children.map(this.props.children, (child)=>{
if (child.type && child.type.prototype && child.type.prototype.constructor.displayName === 'Input') {
let additionalProps = {
fieldSchema: this.props.schema.pick(child.props.name),
onChange: this.onChange
};
return React.cloneElement(child, additionalProps);
}
return child;
});
},
render() {
return(
<form>
{this.renderChildren()}
</form>
);
}
});
我在这里做的是“克隆”每个“输入”子项并根据模式添加一些新props。
所以第一个问题是:
这真的是 reactJs 中的正确战争吗?当我没有“克隆”每个元素并添加新属性时,我必须直接在我的视图中添加属性,对吗?类似的东西,但我试图阻止这种情况,因为我需要的所有信息都已经作为表单架构中的props。
在玩弄这个之后我发现, this.props.children 只有第一级的孩子。但是,当我在我的Form
组件中嵌套我的孩子时,我的组件将不再工作,因为我的组件正在用Input
被操纵的组件替换组件。
例子:
<Form
schema={MyFormSchema}
>
<AnotherComponent>
<Input name="name" />
</AnotherComponent>
<Input name="age" />
</Form>
当我像现在一样这样做时,此代码将不再起作用,因为在 this.props.children 我只有 [AnotherComponent, Input[name=age]] 而缺少 Input[name=name]。所以我认为我这样做的方式是错误的。但我不确定。
所以主要问题是:
就像在我的例子中一样:在 ReactJs 中将props(或任何东西)继承给所有孩子(也是嵌套的)的正确方法是什么 - 或者这在“react”方式中是不可能的,我真的必须传递所有必要的props给所有孩子?
编辑:
当我谈论“将所有必要的props传递给所有孩子”时,我的意思是这样的:
<Form
schema={MyFormSchema}
>
<AnotherComponent>
<Input name="name" fieldSchema={this.getFieldSchema('name')} onChange={this.onChange} />
</AnotherComponent>
<Input name="age" fieldSchema={this.getFieldSchema('age')} onChange={this.onChange} />
</Form>
在这个例子中,我将传递我想由父级动态添加的所有必要的props。在我上面的示例中,下一个问题是:“this”由于其父 AnotherComponent 而不适用于名称输入。所以我必须参考父母——当然:这是可能的,但我认为这将是一种丑陋的方式。