我正在尝试处理React Formik中Field组件的onChange,但是它不起作用。我还尝试通过以下方式在Formik组件之外处理它:
handleChange(e) {
console.log('changing');
}
<Field type="radio" name="players" value="1" onChange={e => this.handleChange(e)}/>
但我收到警告:
一个组件正在将文本类型的不受控制的输入更改为 受控。输入元素不应从不受控制的切换到 控制(反之亦然)。
目前,我的代码如下:
<Formik
onChange={() => {
console.log('changing');
}}
onSubmit={(values) => {
console.log('submitted');
}}
>
{({ isSubmitting, handleChange }) => (
<Form>
<InputWrapper>
<span>1</span>
<Field type="radio" name="players" value="1" onChange={handleChange}/>
<span>2</span>
<Field type="radio" name="players" value="2" onChange={handleChange}/>
</InputWrapper>
<button type="submit" disabled={isSubmitting}>
{isSubmitting ? 'Loading..' : 'Start'}
</button>
</Form>
)}
</Formik>
有什么提示/想法吗?
答案 0 :(得分:5)
在将onBlur:handleBlur引入您的Formik字段时发现的一个问题是,它覆盖了Formik验证。
使用onKeyUp={handleChange}
这解决了上述问题
答案 1 :(得分:1)
我发现了一个对我来说效果很好的技巧,您可以使用formik的“值”并调用将“值”作为参数传递的方法,并使用新值执行操作。
const handleUserChange = (userId: number) => {
//userId is the new selected userId
};
<Formik
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={handleSubmit}
enableReinitialize
>
{({ isValid, isSubmitting, values }) => (
<Form>
<table className="table">
<tbody>
<tr>
<td>Users</td>
<td>
<Field name="userId" className="form-control" as="select">
<option value="">--select--</option>
{data.Users.map((user, index) => (
<option key={user.id} value={user.id}>{`User ${index + 1}`}</option>
))}
</Field>
</td>
</tr>
{handleUserChange(values.userId)}
</tbody>
</table>
<div className="row">
<div className="col-sm-12">
<SubmitButton label="Save" submitting={isSubmitting} disabled={!isValid || isSubmitting} />
</div>
</div>
</Form>
)}
</Formik>
答案 2 :(得分:0)
您必须像下面那样使用字段的InputProps ...
Bucket List:
aws-ip-update-01
aws-ip-update-02
aws-ip-update-bucket
case4667772691-cloudtraillogs
cf-templates-10gcjonooe0lj-us-east-1
config-bucket-832839043616
fsaas
company-aws-config
company-cloudtrail-nonprod
company-dev
company-isam9
company-netbackup-nonprod
company-timd-test-bucket
kpmgimagedeploy
ussvcsplunkaws-nonprod-keys
要在Field中使用InputProps,您需要使用formik-material-ui库中的组件TextField。
另一种方法是使用onKeyUp或onKeyDown,该函数可以与Field正常工作,并且这些函数类似于onChange
import { TextField } from 'formik-material-ui';
<Field
type="radio"
name="players"
value="2"
component={TextField}
InputProps={{ onBlur:handleBlur }}/>