javascript - React Formik 复选框组不会变成单个选中或未选中元素的数组

标签 javascript reactjs formik

我正在使用 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/

相关文章:

javascript - window.matchMedia 的 AddEventListener 无法正常工作 javascript

javascript - 使用 Angular 转换 JSON 文件中的 HTML

reactjs - formik 表单验证不起作用 reactjs

reactjs - Formik - 确认后如何重置表单

javascript - 是否有另一种方法对 TextBox 使用 onTextChanged 并避免每次刷新页面?

javascript - Node.js http.request options 主机名参数的正确格式是什么?

css - Material-ui Grid 元素高度超过其容器的高度

android - React Native 样式问题。不变的违反

reactjs - 样式化组件和 React : Click event

javascript - 使用 Yup 验证以检查字符串或数字长度