formik 警告,组件正在更改不受控制的文本类型输入以进行控制

新手上路,请多包涵

我正在 React JS 中开发动态表单,当用户单击“添加”按钮时,“注册”表单将添加到屏幕。在注册表格中,我使用 formik 进行验证。

表单动态添加成功,但每当我开始在输入框中输入任何内容时,我在控制台中收到以下错误:

 Warning: A component is changing an uncontrolled input of type text to be
controlled. Input elements should not switch from uncontrolled to controlled
(or vice versa). Decide between using a controlled or uncontrolled input element
for the lifetime of the component.

我不确定哪里错了。下面是我的动态表单渲染代码 -

帐户.js

 import React, { Component } from 'react';
import axios from 'axios';
import {
    Card, CardBody, CardHeader,Button,Col, Row, Form, Container
} from 'reactstrap';
import { Formik, Field, ErrorMessage } from 'formik';
import WrapperForm from './WrapperForm'

class Account extends Component {

  state = {
    wrapperForm: [{}]
  }

  constructor(props) {
    super(props);
  }

  addUser = () => {
    this.setState((prevState) => ({
      wrapperForm: [...prevState.wrapperForm, {}],
    }));
  }

  render() {
    let { wrapperForm } = this.state
    return (
      <Form>
        <Container className="themed-container" fluid={true}>
          <button type="button" onClick={this.addUser}>Add User</button>
          <WrapperForm wrapperForm={wrapperForm} />
        </Container>
      </Form>
    );
  }
}

export default Account;

WrapperForm.js

 const WrapperForm = (props) => {
  return (
    props.wrapperForm.map((val, idx)=> {
      return (
        <Formik
          key={idx}
          initialValues={{
            email: props.wrapperForm[idx].email || '',
            password: props.wrapperForm[idx].password || '',
            firstName: props.wrapperForm[idx].firstName || '',
            lastName: props.wrapperForm[idx].lastName || '',
            zipCode: props.wrapperForm[idx].zipCode ||  ''
          }}
        >
          {({ values }) => (
            <Row style={{ marginBottom: "2em" }}>
              <Card>
                <CardHeader>Register</CardHeader>
                <CardBody>
                  <Temp index={idx} />
                </CardBody>
              </Card>
            </Row>
          )}
        </Formik>
      )
    })
  )
}

Temp.js

 const Temp = ({ index }) => {
  let passwordId = 'password-'+ index;
  let firstNameId = 'firstName-'+ index;
  let lastNameId = 'lastName-'+ index;
  let zipCodeId = 'zipCode-'+ index;

  return (
    <Card body outline color="primary">
      <CardTitle>Create Profile</CardTitle>
      <Row form>
        <Col md={6}>
          <Field
            className="email"
            component={customInputForm}
            data-id={index}
            id="email"
            label="Email"
            name="email"
            placeholder="Email"
            type="email"
          />
        </Col>
      </Row>
    </Card>
  )
}

原文由 ppb 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 456
2 个回答

我找到了一个解决方案,也许它会对某人有所帮助。您需要为 formik 创建动态 initialValues 为:

 let passwordId = 'password-'+ idx ;
let firstNameId = 'firstName-'+ idx;
let lastNameId = 'lastName-'+ idx;
let zipCodeId = 'zipCode-'+ idx;

return (
  <Formik
      key={idx}
      initialValues={{
          email: props.wrapperForm[idx].email || '',
          [passwordId]: props.wrapperForm[idx].password || '',
          [firstNameId]: props.wrapperForm[idx].firstName || '',
          [lastNameId]: props.wrapperForm[idx].lastName || '',
          [zipCodeId]: props.wrapperForm[idx].zipCode ||  ''
      }}
  >
)

原文由 ppb 发布,翻译遵循 CC BY-SA 4.0 许可协议

通读以上所有评论非常有帮助,特别是对于理解 React 中表单元素中不受控组件和受控组件之间的基本区别。但是,将 InitialValues 作为属性添加到 Formik 后,我遇到了同样的错误。这让我意识到,每当反应将表单输入视为不受控制(在 DOM 中受控)并结合反应组件中的状态更改功能时,就会发生错误。事实上,我收到错误是因为在我的 react useState 挂钩中初始化的变量名称与我用作表单输入键的表单上的名称属性不同。如果在 Formik 上添加 InitialValues 属性后出现相同的错误,则应确保状态变量与每个表单输入上的名称属性相同。

原文由 Jaylukmann 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题