【发布时间】:2019-03-22 09:46:39
【问题描述】:
我正在寻找合适的模式/方法来使用 React 开发它,但到目前为止我没有找到任何相关/优雅的东西。
我基本上想写一个表单引擎。对于表单的每个输入,我想要一些通用的行为。
我在 React 文档中读到继承不是正确的方法;好的方法是设计一个通用组件并通过组合对其进行专门化。
在我的顶级组件中,我想写如下内容:
<Form>
<TextInput .../>
<TextInput .../>
<EmailInput .../>
</Form>
每种类型的输入基本上都必须做同样的事情:例如:根据它的验证器检查这个值,等等。
所以,我设计了一个通用组件FormInput,其中包含所有这些标准行为。当我编写 TextInput 组件时,它是这样的:
export default class TextInput extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<FormInput>
<input name={this.props.name}
type='text'
onChange={this.onChange}
onBlur={this.dirty}
value={this.state.value}
/>
</FormInput>
);
}
}
现在,问题在于this.onChange 或this.dirty 是位于FormInput 组件中的标准行为,所以很明显,我不能像那样直接访问它们...
将转入的内容连接到其容器组件的正确方法是什么?
编辑
只是为了澄清和总结目标,我基本上想制作一个通用组件和一个嵌入的内容/模板。这个问题是我需要将特定的 DOM 模板(在特定组件中)绑定到通用处理程序(在通用组件中)。
提前致谢!
【问题讨论】:
-
您希望
FormInput或TextInput处理更改和验证? -
@Sagivb.g
FormInput必须托管所有标准内容,例如更改和验证。TextInput必须基本上只承载 html<input>标记及其样式。 -
所以看来你的层次结构是错误的 imo,
FormInput应该换行TextInput。 -
很可能是我的层次结构错了!您能否提供一个包含适当包装组件的样本?
-
另一个问题,
Form不应该为每个孩子input处理onChange和value之类的逻辑吗?
标签: javascript reactjs typescript transclusion