简体   繁体   English

如何在 React 中有条件地执行 POST 请求?

[英]How can I conditionally do POST request in React?

First, please look at the code.首先,请看代码。

    const [detailTitle, setDetailTitle] = useState(actionItemArray[activeRow].TITLE);
    const [detailDesc, setDetailDesc] = useState(actionItemArray[activeRow].DESCRIPTION);

    //Unix time 변환 함수
    function getUnixTime(t) {
        const date = new Date(t * 1000);
        const year = date.getFullYear();
        const month = '0' + (date.getMonth() + 1);
        const day = '0' + date.getDate();
        return year.toString().substr(-2) + '-' + month.substr(-2) + '-' + day.substr(-2);
    }

    const [detailStartDate, setDetailStartDate] = useState(getUnixTime(actionItemArray[activeRow].START_DATE));
    const [detailDueDate, setDetailDueDate] = useState(getUnixTime(actionItemArray[activeRow].DUE_DATE));

    const [detailPriority, setDetailPriority] = useState(actionItemArray[activeRow].P_PK);
    const [detailStep, setDetailStep] = useState(actionItemArray[activeRow].STEP_PK);

    const [disabled, setDisabled] = useState(true);
    const [disableTag, setDisableTag] = useState(true);

    const detailTitleChange = (e) => {
        setDetailTitle(e.target.value);
    };

    const detailDescChange = (e) => {
        setDetailDesc(e.target.value);
    };

    const detailStartDateChange = (e) => {
        setDetailStartDate(e.target.value)
    };

    const detailDueDateChange = (e) => {
        setDetailDueDate(e.target.value)
    };

and for Priority and Step, I gave onChange event as it is a Select Form.对于优先级和步骤,我给出了 onChange 事件,因为它是一个 Select 表单。

    const updateActionItem = () => {
        const url = '/api/work/update-action-item';
        const data = {
            ACTION_PK : actionItemArray[activeRow].ACTION_PK,
            OWNER_PK : actionItemArray[activeRow].owner.USER_PK,
            TITLE : detailTitle,
            DESCRIPTION: detailDesc,
            START_DATE : detailStartDate,
            DUE_DATE : detailDueDate,
            P_PK : detailPriority,
            STEP_PK : detailStep,
            updateCols: ['TITLE', 'DESCRIPTION']
        };
        post(url, data)
        .then((res) => {
            alert('수정되었습니다');
            console.log(res);
        })
        .catch((error) => {
            console.log(error)
        });
    };

this function is for a POST request.此 function 用于 POST 请求。 I send every edited data to DB.我将每个编辑的数据发送到数据库。

But data object, you can see updateCols: [].但是数据object,可以看到updateCols:[]。

In this array, I have to put properties that have been changed.在这个数组中,我必须放置已更改的属性。

For example, If I change TITLE, DESCRIPTION and START_DATE, I have to change the array to例如,如果我更改 TITLE、DESCRIPTION 和 START_DATE,我必须将数组更改为

updateCols : ['TITLE', 'DESCRIPTION', START_DATE]

I am having trouble with this POST request form as I think it is impossible to track things down every time.我在使用这个 POST 请求表单时遇到了问题,因为我认为每次都无法追踪到事情。

Someone might edit only TITLE, someone might edit every property.有人可能只编辑 TITLE,有人可能会编辑每个属性。 That means I have to change POST request form conditionally.这意味着我必须有条件地更改 POST 请求表单。

I need some wisdom.我需要一些智慧。 Please Help!请帮忙!

You can save your data in state before posting.您可以在发布前将数据保存在 state 中。 When you post the next time, compare the new data with the old state and hence create the updateCols using Array.prototype.push().下次发布时,将新数据与旧的 state 进行比较,从而使用 Array.prototype.push() 创建 updateCols。 You can use ternary operators to compare the values.您可以使用三元运算符来比较这些值。

   const [old, setOld] = useState({});
       
    const updateActionItem = () => {
         const url = '/api/work/update-action-item';
         let data = {
             ACTION_PK : actionItemArray[activeRow].ACTION_PK,
             OWNER_PK : actionItemArray[activeRow].owner.USER_PK,
             TITLE : detailTitle,
             DESCRIPTION: detailDesc,
             START_DATE : detailStartDate,
             DUE_DATE : detailDueDate,
             P_PK : detailPriority,
             STEP_PK : detailStep,
             updateCols : []
         };
         
         data.ACTION_PK!==old.ACTION_PK?data.updateCols.push('ACTION_PK'):null;
         data.OWNER_PK!==old.OWNER_PK?data.updateCols.push('OWNER_PK'):null;
         data.TITLE!==old.TITLE?data.updateCols.push('TITLE'):null;
         data.DESCRIPTION!==old.DESCRIPTION?data.updateCols.push('DESCRIPTION'):null;
         data.START_DATE!==old.START_DATE?data.updateCols.push('START_DATE'):null;
         data.DUE_DATE!==old.DUE_DATE?data.updateCols.push('DUE_DATE'):null;
         data.P_PK!==old.P_PK?data.updateCols.push('P_PK'):null;
         data.STEP_PK!==old.STEP_PK?data.updateCols.push('STEP_PK'):null; 
         
         setOld(data);
         
         post(url, data)
         .then((res) => {
             alert('수정되었습니다');
             console.log(res);
         })
         .catch((error) => {
             console.log(error)
         });
     };

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM