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 ()屏幕中没有损坏,但组件中未填写日期。它是如何工作的?
问题 :
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)
工作演示:
| 归档时间: |
|
| 查看次数: |
565 次 |
| 最近记录: |