gpt4 book ai didi

forms - React JS - 用动态子元素组成通用形式

转载 作者:行者123 更新时间:2023-12-03 14:20:13 24 4
gpt4 key购买 nike

我只是reactjs的初学者。我对使用它感觉非常好,但我已经有一段时间被困在我想要实现的一个概念上,这将解决我很多其他问题。

概念

  • 我想创建一个表单组件,可以将动态子组件传递给它。它不会是像 LoginForm、ContactForm 等特定的表单组件。相反,它只是 Form

方法 1

class LoginPage extends Rect.Component {

constructor(props) {
super(props)

this.submit = this.submit.bind(this);
this.validate = this.validate.bind(this);
this.reset = this.reset.bind(this);
}

submit(...args) {
this.refs.form.submit(args);
}

validate(...args) {
this.refs.form.validate(args);
}

reset(...args) {
this.refs.form.reset(args);
}

render() {
return (
<LoginPage>
<Form ref="form" onSubmit={this.submit}>
<Input value="email" pattern="/email_pattern/" onValidate={this.validate} />

<Input value="password" pattern="/password_pattern/" onValidate={this.validate} />

<Button value="submit" action={this.submit} />
<Button value="reset" action={this.reset} />
</Form>
</LoginPage>
}
}
  • Input onChange 调用验证函数,该函数仅将参数传递给表单的验证函数。让表格知道它的所有子项是否都经过验证。我将 isValid 和 targetInputComponent 作为参数传递给表单。
  • Button Submit onClick 同样调用提交函数,LoginPage(充当中间件)将调用传递给 Form 组件。表单检查其状态是否无效输入等。
  • Button Reset onClick 调用同样会传递到 Form 组件。但是表单如何处理此重置功能呢?输入的值由LoginPage 控制。表单无法更改输入的值。

方法2

我所做的是将输入的数据和有效性添加到 LoginPage 状态。现在,表单和输入都只需调用登录页面来更新其状态。表单和输入组件使用此状态作为 Prop 。

class LoginPage extends React.Component {

constructor(props) {
super(props)

this.state = {
formSchema: this.initSchema()
}

this.validateField = this.validateField.bind(this);
this.submitForm = this.submitForm.bind(this);
}

initSchema() {
const formSchema = {
email: {
isValid: false,
value: ''
},
password: {
isValid: false,
value: ''
},
password2: {
isValid: false,
value: ''
}
}

return formSchema;
}

validateField(dataObj, targetComponent) {

const formSchema = Object.assign(this.state.formSchema, dataObj);

this.setState({ formSchema })
}

submitForm(isSuccess) {
console.log(isSuccess);
console.log('Form Submit: ', this.state.formSchema);

throw new Error('Submition Error');
}

reset() {
// Loop through each object in formSchema and set it's value to empty, inputs will validate themselves automatically.
}

render() {
return <div>
<Form ref="formLogin" className="auth-form" onSubmit={this.submitForm} formSchema={this.state.formSchema}>
<h1>
Switch Accounts
</h1>
<Input type="email" name="email" onValidate={this.validateField} value={this.state.formSchema.email.value}
isValid={this.state.formSchema.email.isValid}/>

<Input type="password" name="password" onValidate={this.validateField} value={this.state.formSchema.password.value}
isValid={this.state.formSchema.password.isValid}/>

<Button value="Submit" type="submit" />
</Form>
</div>
}
}

问题

这种方法使 LoginPage 组件变得非常困惑。如果页面上有多个表单,LoginPage 组件将如何处理表单? LoginPage 还会有更多功能,如列表、网格、模态框等。此 LoginPage 不应处理这些情况。 表单应负责所有输入、提交等功能。该表单组件应该对所有类型的表单都是通用的。我不想创建登录表单、联系表单等功能表单。

这个问题的解决方案将对我在许多其他组件方面有很大帮助。

最佳答案

您的方法 2 是处理此问题的标准方法。

为什么不创建一个单独的 <LoginForm> ?这样做可以将字段和验证从页面上的其他不相关功能中抽象出来。

如果稍后您需要<ContactForm>或任何其他类型的表单,它将具有不同的字段和不同的验证逻辑,这意味着无论如何您都需要构建它。

缺少使用类似 redux 的东西,您走在正确的道路上。

关于forms - React JS - 用动态子元素组成通用形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44277739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com