Компонент Datepicker нарушает экран редактирования, используя @unform и response-datepicker - PullRequest
6 голосов
/ 27 мая 2020

Я создал следующий компонент для выбора дат в UnForm:

export default function DatePickerInput({ name, ...rest }) {
  const datepickerRef = useRef(null);
  const { fieldName, defaultValue = '', registerField } = useField(name);

  const [date, setDate] = useState(defaultValue || null);
  useEffect(() => {
    registerField({
      name: fieldName,
      ref: datepickerRef.current,
      path: 'props.selected',
    });
  }, [fieldName, registerField]);

  return (
    <Label htmlFor={fieldName}>
      <UnInput>
        <ReactDatePicker
          ref={datepickerRef}
          selected={date}
          onChange={setDate}
          dateFormat="dd/MM/yyyy"
          placeholderText="dd/mm/aaaa"
          writable="true"
          {...rest}
        />
      </UnInput>
    </Label>
  );
}

Для сохранения записей компонент работает нормально, загружая и сохраняя дату, которую я выбрал. Когда я собираюсь редактировать запись, при попытке загрузить дату при начальной загрузке страница не работает и отображается следующая ошибка:

Unhandled Rejection (TypeError): Cannot assign to read only property 'selected' of object '#<Object>'

Если я закомментирую строку path: 'props.selected', в useEffect () экран не битый, но дата в компоненте не заполняется. Как это работает?

1 Ответ

1 голос
/ 05 июня 2020

Проблема:

formRef.current.setFieldValue('birthday',value) это попытается установить значение для предоставленного path, в нашем случае предоставленный путь - props.selected.

И props.selected - свойство только для чтения, поэтому вы не можете установить значение для props, отсюда и ошибка.

useEffect(() => {
    registerField({
      name: fieldName,
      ref: datepickerRef.current,
      path: 'props.selected', // <---- this is props, and it's readonly
      clearValue: (ref) => {
        ref.clear();
      },
    });
}, [fieldName, registerField]);

Решение:

Вы можете удалите path и используйте методы getter и setter с именами getValue и setValue:

setValue: для установки начального значения или того, что передано из setFieldValue

getValue: для получения значения при отправке

useEffect(() => {
    registerField({
      name: fieldName,
      ref: datepickerRef.current,
      clearValue: ref => {
        ref.clear();
      },
      setValue: (e, v) => {
        setDate(new Date(v)); // <---- Setting up default value 
      },
      getValue: () => {
        return datepickerRef.current.props.selected; // to get selected value from Date picker's props
        // OR
        return Date.toString(); // to get selected value from state it self
      }
    });
}, [fieldName, registerField]);

РАБОЧАЯ ДЕМО :

Edit #SO-Datepicker-unform-setvalue

...