javascript - React'te modal kapatıldığında içeriği sıfırlamanın bir yolu
React-hook-form ile doğrulanan bazı girişlere sahip bu modala sahip olmak:
import { yupResolver } from '@hookform/resolvers/yup';
import { useForm } from 'react-hook-form';
import * as yup from 'yup';
import { Modal, Footer, Input, Textarea } from '../ui-components';
import { usePostData } from '../lib/hooks/use-post-data';
const schema = yup.object().shape({
input: yup.string(),
description: yup.string()
});
export interface MyModalProps {
open: boolean;
toggle: () => void;
}
export function MyModal({ open, toggle }: MyModalProps) {
const emptyInput = {
input: '',
description: ''
};
const { handleSubmit, reset, register } = useForm({
resolver: yupResolver(schema)
});
const { mutate: postDta } = usePostData();
const onAddSubmit = (data) => {
postSignalMapping(data);
toggle();
reset(emptyInput);
};
const onCancelModal = () => {
toggle();
reset(emptyInput);
};
return (
<Modal
title='my modal'
open={open}
onClose={toggle}
footer={<Footer onSubmit={handleSubmit(onAddSubmit)} onCancel={onCancelModal} />}
>
<div>
<Input inputId='input' label='input' {...register('input')} />
<Textarea label='description' {...register('description')} />
</div>
</Modal>
);
}
export default MyModal;
Modal kapatıldığında yapılması gereken reset kısmı dışında oldukça iyi çalışıyor, bazen bazı hataları oluyor.
Modal kapandıktan sonra yeniden render edilmesini sağlamanın bir yolu var mı?
Cevap #1
Görünüşe göre useForm kancasına varsayılan değerleri de sağlamanız gerekiyor.
reset belgeleri
Controllerbileşenlerinin değerini sıfırlamak içinuseForm'adefaultValuesgeçirmeniz gerekecek.useFormaracılığıyladefaultValuessağlamadanreset({ value })çağrıldığında, kütüphane, sağladığınızvaluenesnesinin sığ bir kopyası iledefaultValuesyerine geçirecektir (deepClone değil).// ❌ avoid the following with deep nested default values const defaultValues = { object: { deepNest: { file: new File() } } }; useForm({ defaultValues }); reset(defaultValues); // share the same reference // ✅ it's safer with the following, as we only doing shallow clone with defaultValues useForm({ deepNest: { file: new File() } }); reset({ deepNest: { file: new File() } });
Boş emptyInput varsayılan değerler nesnesinin sığ kopyalarını oluşturmak için yayma sözdizimini kullanın.
export function MyModal({ open, toggle }: MyModalProps) {
const emptyInput = {
input: '',
description: ''
};
const { handleSubmit, reset, register } = useForm({
defaultValues: { ...emptyInput },
resolver: yupResolver(schema)
});
...
const onAddSubmit = (data) => {
postSignalMapping(data);
toggle();
reset({ ...emptyInput });
};
const onCancelModal = () => {
toggle();
reset({ ...emptyInput });
};
...
}
