当前位置: 首页 > 知识库问答 >
问题:

formik组件正在将文本类型的受控输入更改为非受控输入

苍烨然
2023-03-14

我一直有这个错误:一个组件正在将受控输入的类型文本更改为不受控制。输入元件不应从受控切换到不受控(反之亦然)。决定在组件的生命周期内使用受控或不受控制的输入元件。当我尝试将值从数据库输入框点击编辑

这是我的代码:

const initialValues = {
        medTestId: '',
        healthcareProviderId: '',
        accountId: '',
        newbornId: '',
        paymentStatus: '',
        completionStatus: false,
        dateCompleted: ''
    };

    const validationSchema = Yup.object().shape({
        medTestId: Yup.string()
            .required('Test is required'),
        healthcareProviderId: Yup.string()
            .required('Healthcare Provider is required'),
        accountId: Yup.string()
            .required('Patient is required'),
        newbornId: Yup.string()
            .required('Newborn is required'),
        paymentStatus: Yup.string()
            .required('Payment Status is required'),
        completionStatus: Yup.bool()
            .oneOf([true], 'Completion Status is required'),
        dateCompleted: Yup.date()
    });

    const DatePickerField = ({...props}) => {
        const {setFieldValue} = useFormikContext();
        const [field] = useField(props);
        return(
            <DatePicker
            {...field}
            {...props}
            selected={(field.value && new Date(field.value)) || null}
            onChange={val => {
                setFieldValue(field.name, val);
            }}
            />
        );
    };

    function onSubmit(fields, { setStatus, setSubmitting }) {
        setStatus();
        if (isAddMode) {
            createmedTestOrder(fields, setSubmitting);
        } else {
            updatemedTestOrder(id, fields, setSubmitting);
        }
    }

    function createmedTestOrder(fields, setSubmitting) {
        medTestOrderService.create(fields)
            .then(() => {
                alertService.success('Test Order added successfully', { keepAfterRouteChange: true });
                history.push('.');
            })
            .catch(error => {
                setSubmitting(false);
                alertService.error(error);
            });
    }

    function updatemedTestOrder(id, fields, setSubmitting) {
        medTestOrderService.update(id, fields)
            .then(() => {
                alertService.success('Update successful', { keepAfterRouteChange: true });
                history.push('..');
            })
            .catch(error => {
                setSubmitting(false);
                alertService.error(error);
            });
    }


    return (<div className="Col-md-10 offset-md-1" style={{
        marginTop: '20px'
      }}>
        <Formik initialValues={initialValues} validationSchema={validationSchema} onSubmit={onSubmit}>
            {({ errors, touched, isSubmitting, values, setFieldValue }) => {

                useEffect(() => {
                    if (!isAddMode) {
                        // get user and set form fields
                        medTestOrderService.getById(id).then(user => {
                            const fields = ['medTestId', 'healthcareProviderId', 'accountId', 'newbornId', 'paymentStatus', 'dateCompleted','completionStatus'];
                            fields.forEach(field => setFieldValue(field, user[field], false));
                        });
                    }
                }, []);

                return (
                        <Form>
                            <h1>{isAddMode ? 'Add Test Order' : 'Edit Test Order'}</h1>
                            <div className="form-row">
                                <div className="form-group col-4">
                                    <label>Test</label>                                
                                    <Field name="medTestId" as="select" className={'form-control' + (errors.medTestId && touched.medTestId ? ' is-invalid' : '')}>
                                    <option value=""></option>
                                        {medtests && medtests.map( medtest => 
                                        <option key={medtest.id} value={medtest.id}>{medtest.name}</option>
                                        )}
                                    </Field>
                                    <ErrorMessage name="medTestId" component="div" className="invalid-feedback" />
                                </div>
                                <div className="form-group col-4">
                                    <label>Healthcare Provider</label>
                                    <Field name="healthcareProviderId" as="select" className={'form-control' + (errors.healthcareProviderId && touched.healthcareProviderId ? ' is-invalid' : '')}>
                                    <option value=""></option>
                                        {healthcareproviders && healthcareproviders.map( healthcareprovider => 
                                        <option key={healthcareprovider.id} value={healthcareprovider.id}>{healthcareprovider.fullName}</option>
                                        )}
                                    </Field>
                                    <ErrorMessage name="healthcareProviderId" component="div" className="invalid-feedback" />
                                </div>
                                <div className="form-group col-4">
                                    <label>Patient</label>
                                    <Field name="accountId" as="select" className={'form-control' + (errors.accountId && touched.accountId ? ' is-invalid' : '')}>
                                    <option value=""></option>
                                        {accounts && accounts.map( account => 
                                        <option key={account.id} value={account.id} >{account.firstName} {account.lastName}</option>
                                        )}
                                    </Field>
                                    <ErrorMessage name="accountId" component="div" className="invalid-feedback" />
                                </div>
                            </div>
                            <div className="form-row">
                                <div className="form-group col-3">
                                    <label>Newborn</label>
                                    <Field name="newbornId" as="select" className={'form-control' + (errors.newbornId && touched.newbornId ? ' is-invalid' : '')}>
                                        <option value=""></option>
                                        {newborns && newborns.map( newborn => 
                                        <option key={newborn.id} value={newborn.id}>{newborn.firstName} {newborn.lastName}</option>
                                        )}
                                    </Field>
                                    <ErrorMessage name="newbornId" component="div" className="invalid-feedback" />
                                </div>
                                <div className="form-group col-3">
                                    <label>Payment Status</label>
                                    <Field name="paymentStatus" as="select" className={'form-control' + (errors.paymentStatus && touched.paymentStatus ? ' is-invalid' : '')}>
                                        <option value=""></option>
                                        <option value="Complete Payment">Complete Payment</option>
                                        <option value="Incomplete Payment">Incomplete Payment</option>
                                        <option value="Unpaid">Unpaid</option>
                                    </Field>
                                    <ErrorMessage name="paymentStatus" component="div" className="invalid-feedback" />
                                </div>
                                <div className="form-group col-3">
                                    <label>Date Completed</label>
                                    <DatePickerField name="dateCompleted" value={values.dateCompleted} onChange={setFieldValue} className={'form-control' + (errors.dateCompleted && touched.dateCompleted ? ' is-invalid' : '')}>                                   
                                    </DatePickerField>
                                    <ErrorMessage name="dateCompleted" component="div" className="invalid-feedback" />
                                </div>
                                <div className="form-group form-check" style={{marginTop: '35px', marginLeft: '20px'}}>
                                    <Field type="checkbox" name="completionStatus" className={'form-check-input ' + (errors.CompletionStatus && touched.CompletionStatus ? ' is-invalid' : '')} />
                                    <label htmlFor="completionStatus" className="form-check-label">Order Completed ?</label>
                                    <ErrorMessage name="completionStatus" component="div" className="invalid-feedback" />
                                </div>
                            </div>
                            <div className="form-group">
                                <button type="submit" disabled={isSubmitting} className="btn btn-primary">
                                    {isSubmitting && <span className="spinner-border spinner-border-sm mr-1"></span>}
                                    Save
                                </button>
                                <Link to={isAddMode ? '.' : '..'} className="btn btn-link">Cancel</Link>
                            </div>
                        </Form>
                );
            }}
        </Formik>
    </div>
    );

共有1个答案

梁丘安晏
2023-03-14

改成这样:

const initialValues = {
        ....
        dateCompleted: new Date()
    };
 类似资料:
  • 我正在对我的组件进行排序 我在选择标记中有一个错误。获取错误props.filters.sortby的值最初是日期。当我试图从下拉列表中更改它时,错误发生了。

  • 我试图更改Select input的值,然后在控制台中得到以下警告。 index.js:1446警告:一个组件正在将text类型的受控输入更改为不受控。输入元素不应从受控切换到非受控(或反之亦然)。决定在组件的生存期内使用受控还是不受控的输入元素。 但我只是以正确的方式更新状态,这是我的代码 有人能提出问题吗?

  • 问题内容: 警告:组件正在更改要控制的文本类型的不受控制的输入。输入元素不应从不受控制切换为受控制(反之亦然)。确定在组件的使用寿命中使用受控或非受控输入元素。* 以下是我的代码: 问题答案: 原因是,在您定义的状态下: 字段作为空白对象,因此在第一次渲染期间将是,输入字段的值将为: 因此,输入字段将变得不受控制。 在输入中输入任何值后,状态将变为: 那时输入字段被转换为受控组件;这就是为什么您得

  • 我试图摆脱这个错误信息,但仍然没有成功。 还有Facebook页面的链接,但我仍然不知道该如何找到它。 在输入似乎总是一个非空值,我如何解决这个问题?

  • 使用ui textfield时出错 警告:TextField正在将text类型的受控输入更改为不受控。输入元素不应从受控切换到非受控(或反之亦然)。决定在组件的生存期内使用受控还是不受控输入元素

  • 我有一个页面,我从服务器上获取数据,并为受控输入设置状态值。(例如,我有一个值为的输入,我从服务器上获取名称(例如Dave)并将其设置为name,因此输入值为Dave。它可以工作,但我遇到了对象数组的问题。) 所以这就是状态 这就是我如何使用 但这会导致此错误: