4Manuals

  • PDF Cloud HOME

在异步循环中设置useState挂钩 Download

    从文件初始化类的最佳方法(异步)? CSS / JS-如何覆盖一个孩子而不是其他孩子的父母过渡 反应:更改方向后触发重新渲染和offsetWidth的重新计算 我的Javascript从'string'转换为'integer'或'number'无效 如何删除外部索引并合并内部json 在React Native 图片无法通过javascript刷新 如何在react图表上的datakey中操作DateTime 在Cypress中保存变量 此声明在dart中的Future类中意味着什么:FutureOr <R>函数(动态)onValue

我对reactJs陌生。

我正在尝试在异步循环中连接结果,但是出了点问题。 setState不能正确保存,当我打印它时,我可以看到它是一个空数组,我想是因为里面有一个异步调用。

我该如何解决?请建议我。

function App() {

  const [data, setData] = useState({data:[]});

  const handleChildSubmit = (data) => {
    setData(data);
  }

  return (
    <div>
      <Form onChildSubmit={handleChildSubmit} />
      <Results flights={data} />
    </div>
  );
}

const Form = ( {onChildSubmit} ) => {

    const [dati, setDati] = useState([]);

    const onFormSubmit = async (e) => {
        e.preventDefault();

        // Flights search Parameters
        const data = new FormData(e.target);
        const dateFrom = data.get('dateFrom');
        const dateTo = data.get('dateTo');
        const departureDay = data.get('day');
        const placeFrom = data.get('placeFrom');
        const placeTo = data.get('placeTo');
        let dayDeparture;
        const daysDeparture = getDayOfWeekArray(dateFrom,dateTo,departureDay);

        // Loop of Fly Search in range time
        for(let i=0; i < daysDeparture.length; i++){
            dayDeparture = daysDeparture[i];
            axios.get('https://api.skypicker.com/flights?flyFrom='+placeFrom+'&to='+placeTo+'&dateFrom='+dayDeparture+'&dateTo='+dayDeparture+'&partner=picky')
            .then(res => {

                setDati([...dati, res.data]);
                onChildSubmit(dati);

            })
            .catch(function (error) {
                console.log('error: '+error);
            })
            .finally(function () {
            });
        }

    }

2 个答案:

答案 0 :(得分:0)

useState提供了一种在更新时使用先前状态的方式(就像在使用类组件时的回调方式一样),可能会导致失败

oid:=res.InsertedID.(primitive.ObjectID)
slice:=oid[:]

答案 1 :(得分:0)

问题在于,useState在这里为您提供了具有特定值的dati变量。然后您的异步操作发生,并且setDati()被多次调用,但是dati不会改变,直到重新呈现表单,然后您再次调用onFormSubmit。

您有一些选择。

您只能将结果作为数组添加一次。

const results = []

for(let i=0; i < daysDeparture.length; i++){
    dayDeparture = daysDeparture[i];
    const res = await axios.get('https://api.skypicker.com/flights?flyFrom='+placeFrom+'&to='+placeTo+'&dateFrom='+dayDeparture+'&dateTo='+dayDeparture+'&partner=picky');
    results.push(res.data);
}

// Add all results when all are fetched.
setDati([...dati, ...results])

或者useReducer可以在您更改状态时可靠地为您提供状态的最新版本,因此您没有陈旧的数据。

// Something like...

function reducer(state, action) {
  switch(action.type) {
    case 'append':
      return [...state, action.payload]
  }
}

function YourComponent() {
  const [dati, dispatch] = useReducer(reducer, [])

  const onFormSubmit = async (e) => {
    for(let i=0; i < daysDeparture.length; i++){
        dayDeparture = daysDeparture[i];
        const res = await axios.get('https://api.skypicker.com/flights?flyFrom='+placeFrom+'&to='+placeTo+'&dateFrom='+dayDeparture+'&dateTo='+dayDeparture+'&partner=picky')
        dispatch({type: 'append', payload: res.data})
    }
  }
}



Similar searches
    使用<display:table>标签(JSP)的分页不一致 如何在Angular 2中进行2个以上的独立/并行http请求 如何为品牌创建特定于应用程序的调色板以替换SAP Fiori for iOS的默认颜色? Samsung RS2545SH Refrigerator User Manual 默认的Webpack配置