我一直有这个错误:一个组件正在将受控输入的类型文本更改为不受控制。输入元件不应从受控切换到不受控(反之亦然)。决定在组件的生命周期内使用受控或不受控制的输入元件。当我尝试将值从数据库输入框点击编辑
这是我的代码:
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>
);
改成这样:
const initialValues = {
....
dateCompleted: new Date()
};
我正在对我的组件进行排序 我在选择标记中有一个错误。获取错误props.filters.sortby的值最初是日期。当我试图从下拉列表中更改它时,错误发生了。
我试图更改Select input的值,然后在控制台中得到以下警告。 index.js:1446警告:一个组件正在将text类型的受控输入更改为不受控。输入元素不应从受控切换到非受控(或反之亦然)。决定在组件的生存期内使用受控还是不受控的输入元素。 但我只是以正确的方式更新状态,这是我的代码 有人能提出问题吗?
问题内容: 警告:组件正在更改要控制的文本类型的不受控制的输入。输入元素不应从不受控制切换为受控制(反之亦然)。确定在组件的使用寿命中使用受控或非受控输入元素。* 以下是我的代码: 问题答案: 原因是,在您定义的状态下: 字段作为空白对象,因此在第一次渲染期间将是,输入字段的值将为: 因此,输入字段将变得不受控制。 在输入中输入任何值后,状态将变为: 那时输入字段被转换为受控组件;这就是为什么您得
我试图摆脱这个错误信息,但仍然没有成功。 还有Facebook页面的链接,但我仍然不知道该如何找到它。 在输入似乎总是一个非空值,我如何解决这个问题?
使用ui textfield时出错 警告:TextField正在将text类型的受控输入更改为不受控。输入元素不应从受控切换到非受控(或反之亦然)。决定在组件的生存期内使用受控还是不受控输入元素
我有一个页面,我从服务器上获取数据,并为受控输入设置状态值。(例如,我有一个值为的输入,我从服务器上获取名称(例如Dave)并将其设置为name,因此输入值为Dave。它可以工作,但我遇到了对象数组的问题。) 所以这就是状态 这就是我如何使用 但这会导致此错误: