Обновление массива объектов с помощью Formik и React Select: методы и примеры кода

В этой статье блога мы рассмотрим различные методы обновления массива объектов с помощью Formik и React Select в приложении React. Мы рассмотрим несколько подходов с примерами кода, которые помогут вам понять и реализовать желаемую функциональность.

Метод 1: использование функции setFieldValueFormik

import { useFormik } from 'formik';
const MyForm = () => {
  const formik = useFormik({
    initialValues: {
      objects: [
        { id: 1, name: 'Object 1' },
        { id: 2, name: 'Object 2' },
        { id: 3, name: 'Object 3' },
      ],
    },
  });
  const handleObjectChange = (index, newValue) => {
    const updatedObjects = [...formik.values.objects];
    updatedObjects[index].name = newValue;
    formik.setFieldValue('objects', updatedObjects);
  };
  return (
    <form>
      {formik.values.objects.map((object, index) => (
        <ReactSelect
          key={object.id}
          value={object.name}
          onChange={(newValue) => handleObjectChange(index, newValue)}
        />
      ))}
    </form>
  );
};

Метод 2: использование хука useField

import { useFormik, useField } from 'formik';
const MyForm = () => {
  const formik = useFormik({
    initialValues: {
      objects: [
        { id: 1, name: 'Object 1' },
        { id: 2, name: 'Object 2' },
        { id: 3, name: 'Object 3' },
      ],
    },
  });
  const ObjectSelect = ({ name, index }) => {
    const [field] = useField(name);
    const handleObjectChange = (newValue) => {
      const updatedObjects = [...formik.values.objects];
      updatedObjects[index].name = newValue;
      formik.setFieldValue('objects', updatedObjects);
    };
    return (
      <ReactSelect
        {...field}
        value={formik.values.objects[index].name}
        onChange={handleObjectChange}
      />
    );
  };
  return (
    <form>
      {formik.values.objects.map((_, index) => (
        <ObjectSelect key={index} name={`objects[${index}].name`} index={index} />
      ))}
    </form>
  );
};

Метод 3. Использование пользовательского компонента ввода

import { useFormik } from 'formik';
const MyForm = () => {
  const formik = useFormik({
    initialValues: {
      objects: [
        { id: 1, name: 'Object 1' },
        { id: 2, name: 'Object 2' },
        { id: 3, name: 'Object 3' },
      ],
    },
  });
  const ObjectInput = ({ name, value, onChange }) => (
    <input type="text" name={name} value={value} onChange={onChange} />
  );
  const handleObjectChange = (index) => (event) => {
    const updatedObjects = [...formik.values.objects];
    updatedObjects[index].name = event.target.value;
    formik.setFieldValue('objects', updatedObjects);
  };
  return (
    <form>
      {formik.values.objects.map((object, index) => (
        <ObjectInput
          key={object.id}
          name={`objects[${index}].name`}
          value={object.name}
          onChange={handleObjectChange(index)}
        />
      ))}
    </form>
  );
};

Обновление массива объектов с помощью Formik и React Select можно выполнить различными методами. В этой статье мы рассмотрели три подхода на примерах кода: использование функции setFieldValueFormik, использование хука useFieldи создание пользовательского компонента ввода. Каждый метод обеспечивает гибкость и может быть адаптирован в соответствии с вашими конкретными требованиями. Не стесняйтесь экспериментировать с этими методами и выберите тот, который лучше всего соответствует потребностям вашего проекта.