GithubHelp home page GithubHelp logo

effector-react-form's People

Contributors

dependabot[bot] avatar gtosss avatar ilyaagarkov avatar mg901 avatar pavelmgs avatar sergeysova avatar xaota avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

effector-react-form's Issues

validationStrategy

перед отправкой проверять валидацию полей это ок

но во время ввода текста в поле иногда требуется чтобы валидация вызывалась не по onChange, а по onBlur


фичреквест добавить настройки валидаций в контроллер

setFieldsPartial

сейчас чтобы изменить значения группы полей формы надо прокинуть все поля в setFields, ручками изменив нужные.
не совсем удобно

  • фичреквест setFieldStatePartial

useFieldArray + validate [feature request]

  const { map, push, remove } = useFieldArray({ name, fieldArray, validate });

Добавить функцию validate в useFieldArray - можно использовать для групповой валидации, например

const { map, push, remove } = useFieldArray({
  name,
  fieldArray,
  validate: list => list.map(e => e.value).every(e => e.length === 0) ? "хотя бы одно поле должно быть заполнено" : undefined
});

controller({ name, outerValidate })

outerValidate - аналогична функции validate, но ставит outerError - ошибки которые не блокируют отправку формы

можно добавить всякие популярные методы (а лучше эффекты) сомнительной полезности, например

  • normalize - фильтрует ввод пользователя в поле ввода
  • disabled - принимает ($values, $meta, ...) и можно поле сделать недоступным для редактирования (добавить к input)
  • hidden - тоже самое, но поле можно скрыть вовсе
  • onDisabledChange, onHiddenChange или ватчеры
const { input, error, isShowError, isHidden } = controller(...);
input.disabled // boolean

удаление полей с валидацией приводит к ошибке при отправке [bug]

кейс
поле удалилось из формы (из UI по крайней мере), но имело валидацию (валидация ставилась в контроллере)
при отправке формы падает ошибка валидации

сейчас решается чем-то вроде сноса fieldState при анмаунте компонента

 useEffect(() => {
    return () => {
      form.setFieldState({
        field: name,
        state: {
          active: false,
          blurred: true,
          blurredAfterOuterError: false,
          changed: false,
          changedAfterOuterError: false,
          touched: false,
          touchedAfterOuterError: false,
          validate: undefined,
          _type: 'fieldMeta',
        }
      });
    }
  }, []);

как вариант, обернуть эту штуку в некий removeField

const { remove } = controller({ name });
useEffect(() => () => remove(), []);

или (из любого места)

form.removeField({ name });

mapSubmit сделать эффектом

скорее всего сейчас mapSubmit в коде используется как fn в sample перед вызовом эффекта onSubmit

но так как это простая функция, нельзя прицепить к ней сторонние сторы, например, через attach.
Единственный вариант - хранить все дополнительные данные в meta - неудобно для больших форм.

убрать зависимость от реакта при вызове form.onChangeFieldBrowser

кейс - нужно изменить значение поля так, чтобы вызвалась логика, реагирующая на изменения поля.
варианты с form.setValue + form.setFieldState не подходят, так как не вызывают этой реакции (и это хорошо)

приходится использовать target: form.onChangeFieldBrowser, но в аргументе там требуется React.SyntheticEvent, что не есть удобно, так как требует импорт реакта в файлик.

надо либо добавить какой-то евент типа form.changeField<T = any>({ field: string, value: T }) который будет прятать в себе вызов onChangeFieldBrowser, либо переделать типы onChangeFieldBrowser

Возможность передавать в remove не только fieldName и index, а функцию

const { map, push, remove } = useFieldArray({ name });
...
map(({ field, fieldItemId, index }) => {
  return <Field key={field.id} onRemove={() => remove(index)} />
});

иногда неудобно, хотелось бы иметь возможность более тонкого удаления

  • как вариант что-то типа form.removeField({ name }) или form.removeFieldFromArray(...)

вложенные fieldArray: создание и удаление полей [bug]

странный кейс

есть filedArray, такой что по-умолчанию есть одно поле
при этом весь этот блок может быть скрыт по какому-то условию

const { map, push, remove } = useFieldArray({ name: "nested" });
useEffect(() => {
  push({ id: uuid() })     // по-умолчанию создается одно поле
  return () => remove(0);  // в идеале бы здесь вызвать removeAll, но это уже другая issue
                           // если не вызывать удаление при сносе компонента, то
                           // при появлении его снова будет вызываться маунт-эффект
                           // и создаваться второе поле и так каждый раз
}, []);

фокус в том, что внутри этого fieldArray есть вложенные поля тоже fieldArray с абсолютно такой же логикой

если мы сносим рутовый fieldArray, то вызывается remove у вложенных, где-то там он у себя глючит и создает рутовый компонент обратно, только с id = undefined (ну и кидает в консоль ошибку что одинаковые react-key)

текущее решение

  • не удалять блоки с fieldArray, а скрывать их, но тогда валидацию надо сносить
  • отказаться от строки return () => remove(0) тогда удаление рута работает нормально, но появляется проблема из камментов

предложения:

  • доработать remove на такой случай
  • добавить в useFieldArray параметры mount / unmount, которые внутри себя будут корректно обрабатывать такие кейсы
  • добавить возможность программного включения / отключения валидации у поля

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.