ค้นหาเว็บไซต์

reactjs - ใช้ปุ่มเพื่อล้างหลายฟิลด์ในฟอร์มแก้ไขของ react-admin


ฉันมีฟอร์มแก้ไขโดยใช้ react-admin และฉันกำลังพยายามหาวิธีเพิ่มปุ่มเพื่อเคลียร์บางช่องเมื่อคลิก

ส่วนที่เกี่ยวข้องของแบบฟอร์ม:

const ProfileEdit = withDataProvider((
    {...props}:{
        record: ProfileRecord,
        dataProvider:DataProvider,
        dispatch:DispatchFunction
    },
) => {
    const {dataProvider, dispatch, ...rest} = props;

    return (
        <Edit {...rest}>
            <TabbedForm >
                <FormTab label='Profile'>
                    <TextInput source='message'/>
                    <DateTimeInput source='start'/>
                    <DateTimeInput source='expiry'/>
                    <FormDataConsumer>
                        {({ formData }) =>
                            <Button onClick={()=>{clearFields(formData)}}>Clear Fields</Button> 
                        }
                    </FormDataConsumer>
                </FormTab>
            </TabbedForm>
        </Edit>
    );
});

และฟังก์ชันเคลียร์:

const clearFields = (data) => {
    data.message = null;
    data.start = null;
    data.expiry = null;

    return null;
};

น่าเสียดายที่นี่ไม่ได้ทำให้เกิดอะไรขึ้นเลย

นี่เป็นเรื่องของการตั้งค่า onClick ของฉันให้ดีขึ้นหรือว่าฉันกำลังทำเรื่องนี้ผิดไปทั้งหมด?

คำตอบ #1

React-admin ใช้มันในการทำงานกับฟอร์ม: react-final-form/final-form: https://final-form.org/docs/final-form/types/FormApi#change

import React, {useCallback} from 'react'
import {useForm} from 'react-final-form';

const ClearFieldsButton = ({ variant, ...props}) => {
  const form = useForm();

  const handleClick = useCallback(() => {  
    form.change('message', undefined);   
    form.change('start', undefined);      
    form.change('expiry', undefined);     
  }, [form]);

  return (
    <Button onClick={handleClick} {...props} />
  );
};

Usage:
...
<FormTab label='Profile'>
  <TextInput source='message'/>
  <DateTimeInput source='start'/>
  <DateTimeInput source='expiry'/>

  <ClearFieldsButton label="Clear Fields" />    
</FormTab

คำตอบ #2

สำหรับตัวจัดการ onClick และเพื่อที่จะสามารถส่งพารามิเตอร์ คุณต้องส่งวัตถุ event พร้อมด้วย ลองแบบนี้:

สำหรับปุ่ม:

<Button onClick={(e)=> clearFields(e, formData)}>Clear Fields</Button> 

สำหรับฟังก์ชัน:

const clearFields = (e, data) => {
    data.message = null;
    data.start = null;
    data.expiry = null;

    return null;
};

** หมายเหตุ: เมื่อคุณกำลังทำ data.message=null และอื่น ๆ คุณกำลังแก้ไขค่าพารามิเตอร์ท้องถิ่น และฉันเห็นว่าคุณส่งค่ากลับเป็น null เสมอ !! คุณแน่ใจเกี่ยวกับตรรกะนี้หรือ !