我正在使用 Formik 在网站上创建表单。在这种形式中,我有一组标签,我想用单独的复选框进行检查,但将它们保存在数组中 tags
. Formik 声称可以通过使用相同的 name
来做到这一点。 Field 元素上的属性,但我无法让它工作。
我正在使用这个 code example作为引用。
这是我的代码:
import React from "react";
import ReactDOM from "react-dom";
import { Formik, Form, Field } from "formik";
import "./styles.css";
function App() {
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<h2>Start editing to see some magic happen!</h2>
<ProjectsForm />
</div>
);
}
const ProjectsForm = props => (
<Formik
initialValues={{
search: "",
tags: []
}}
onSubmit={values => {
console.log(values);
}}
validate={values => {
console.log(values);
}}
validateOnChange={true}
>
{({ isSubmitting, getFieldProps, handleChange, handleBlur, values }) => (
<Form>
<Field type="text" name="search" />
<label>
<Field type="checkbox" name="tags" value="one" />
One
</label>
<label>
<Field type="checkbox" name="tags" value="two" />
Two
</label>
<label>
<Field type="checkbox" name="tags" value="three" />
Three
</label>
</Form>
)}
</Formik>
);
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
也在 CodeSandbox
我期待收到
console.log(values)
的想法显示类似:Object {search: "", tags: ['one', 'three']}
或者
Object {search: "", tags: ['one': true, 'two': false, 'three': true]}
希望我缺少一个简单的东西来添加 Formik 复选框组功能,因为它声称是可能的。
最佳答案
使用 FieldArray
很容易完成零件。
将您的值放在一个数组中,如下所示:
const tagCollection = [
{ value: "one", label: "One" },
{ value: "two", label: "Two" },
{ value: "three", label: "Three" }
];
然后使用
FieldArray
像这样:<FieldArray
name="tags"
render={arrayHelpers => (
<div>
{tagCollection.map(tag => (
<label key={tag.value}>
<input
name="tags"
type="checkbox"
value={tag}
checked={values.tags.includes(tag.value)}
onChange={e => {
if (e.target.checked) {
arrayHelpers.push(tag.value);
} else {
const idx = values.tags.indexOf(tag.value);
arrayHelpers.remove(idx);
}
}}
/>
<span>{tag.label}</span>
</label>
))}
</div>
)}
/>
Working sandbox
更新:
您也可以通过编写自己的组件来做到这一点。
const MyCheckbox = ({ field, form, label, ...rest }) => {
const { name, value: formikValue } = field;
const { setFieldValue } = form;
const handleChange = event => {
const values = formikValue || [];
const index = values.indexOf(rest.value);
if (index === -1) {
values.push(rest.value);
} else {
values.splice(index, 1);
}
setFieldValue(name, values);
};
return (
<label>
<input
type="checkbox"
onChange={handleChange}
checked={formikValue.indexOf(rest.value) !== -1}
{...rest}
/>
<span>{label}</span>
</label>
);
};
// And using it like this:
<Field component={MyCheckbox} name="tags" value="one" label="One" />
<Field component={MyCheckbox} name="tags" value="two" label="Two" />
<Field component={MyCheckbox} name="tags" value="three" label="Three" />
关于javascript - React Formik 复选框组不会变成单个选中或未选中元素的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57654459/