Datepicker 组件使用 @unform 和 react-datepicker 破坏编辑屏幕

Rap*_*ira 6 javascript reactjs react-datepicker unform

我创建了以下组件来在 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>
  );
}
Run Code Online (Sandbox Code Playgroud)

为了保存记录,组件正常工作,加载并保存我选择的日期。当我要编辑记录时,尝试在初始加载中加载日期时,页面损坏并显示以下错误:

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

如果我注释掉该行path: 'props.selected'useEffect ()屏幕中没有损坏,但组件中未填写日期。它是如何工作的?

Viv*_*shi 2

问题 :

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]);
Run Code Online (Sandbox Code Playgroud)

解决方案 :

您可以删除path并使用getterandsetter方法,命名为getValueand 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]);
Run Code Online (Sandbox Code Playgroud)

工作演示

编辑#SO-Datepicker-unform-setvalue