UseState async проблема не обновляет мой список

Я пытаюсь установить DataList перед выполнением вызова API.

но dataList ничего не содержит при выполнении вызова API.

мои коды работают со следующими шагами.

  1. при нажатии кнопки -> выполнить onSubmit ().
  2. Функция getSortedId запускается перед выполнением вызова API для получения отсортированных данных.
  3. выполняет вызов API.

но мой вызов API не работает из-за отсутствия списка данных.

Я знаю, что хуки работают асинхронно.

но как мне отправить вызов API с правильным списком данных.

 const [ dataList, setDataList ] = useState<any>([]); //set Hooks
//a filtering function
  async function getSortedId() {

       await selected.map(data => {
        console.info("transaction_id", data.transaction_id);

         //set sorted Data to datalist
        setDataList((dataList : any) => [...dataList, data.transaction_id]);
      })
  }

 const onSubmit = (data : any) => {
    let refundMsg = "";
    getSortedId();
  
    axios.put("/api/v1/updates", {
      params: {
        "refundIdList" : dataList, //dataList should have some value but it contains nothing.
        "refundReason" : refundMsg,
        "reasonEtcReason" : data.reasonEtcReason,
        "feeUserPay" : data.feeUserPay ? 1 : 0,
        "penaltyFeeUserPay" : data.penaltyFeePartnerPay ? 1 : 0,
        "penaltyFeeUtPay:" : data.penaltyFeeUtPay ? 1 : 0,
        "penaltyFeePartnerPay" : data.penaltyFeePartnerPay ? 1 : 0,       
      }
    }).then(res => {
      console.info("response", res);
    }).catch(err => { 
      console.info("Error : ", err);
    })
    }
  };
 return (
    <Button type = "submit" onClick = {onSubmit()} > Save </Button>
  )

Не вызывайте getSortedId внутри onSubmit - лучше используйте ловушку useEffect с зависимостью от selected (из функции getSortedId), которая обновляет dataList.

nbokmans 06.04.2021 14:40
getSortedId не обязательно должен быть async, поскольку в вашей функции не происходит ничего асинхронного, и вы все равно игнорируете возвращенное обещание внутри onSubmit. Также вы перезаписываете значение dataList каждой записью selected.
Johannes Klauß 06.04.2021 14:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
2
33
1

Ответы 1

Вам нужен перехватчик useEffect для вызова API при изменении dataList

const [dataList, setDataList] = useState<any>([]); //set Hooks
//a filtering function
  function getSortedId() {

  selected.map(data => {
    console.info("transaction_id", data.transaction_id);

    //set sorted Data to datalist
    setDataList((dataList: any) => [...dataList, data.transaction_id]);
  })
}

useEffect(() => {
  callApi()
}, [dataList])

const callApi = async () => {
  if (dataList && dataList.length > 0) {
    axios.put("/api/v1/updates", {
      params: {
        "refundIdList": dataList, //dataList should have some value but it contains nothing.
        "refundReason": refundMsg,
        "reasonEtcReason": data.reasonEtcReason,
        "feeUserPay": data.feeUserPay ? 1 : 0,
        "penaltyFeeUserPay": data.penaltyFeePartnerPay ? 1 : 0,
        "penaltyFeeUtPay:": data.penaltyFeeUtPay ? 1 : 0,
        "penaltyFeePartnerPay": data.penaltyFeePartnerPay ? 1 : 0,
      }
    }).then(res => {
      console.info("response", res);
    }).catch(err => {
      console.info("Error : ", err);
    })
  }

}


const onSubmit = (data: any) => {
  let refundMsg = "";
  getSortedId();
}

return (
  <Button type = "submit" onClick = {onSubmit()} > Save </Button>
)

Другие вопросы по теме