数组在 React 中被逆向填充
Array being filled in inverse in React
我试图用多个对象数组填充一个数组,但在第一次渲染时,数组中的值被反向填充,刷新后它们又回到它们应该的样子。
const getProducts = async (data) => {
await productServices
.getProductsByTakeoffWizardStep(data)
.then((response) => {
setRows((rows) => [...rows, response.data]);
})
.catch((error) => {
console.log(error.response);
});
};
const getTakeoffIDs = () => {
var i = 1;
takeoffServices
.getTakeoffSteps(5)
.then((response) => {
response.data.forEach((element) => {
setSteps((steps) => [...steps, element.description]);
setStepsID((stepsID) => [...stepsID, element.stepID]);
var data = { StepID: element.stepID, TakeoffID: 4 };
getProducts(data);
setStepSequence((stepSequence) => [
...stepSequence,
"Step " + i + "",
]);
i = i + 1;
});
})
.catch((error) => {
console.log(error.response);
});
};
useEffect(() => {
setSteps([]);
setStepsID([]);
setRows([]);
getTakeoffIDs();
}, []);
所以首先渲染数组看起来像这样
(2) [Array(1), Array(2)]
0: Array(1)
0: {product: {…}, quantity: null}
length: 1
[[Prototype]]: Array(0)
1: Array(2)
0: {product: {…}, quantity: null}
1: {product: {…}, quantity: null}
length: 2
[[Prototype]]: Array(0)
length: 2
[[Prototype]]: Array(0)
刷新页面后看起来像这样
(2) [Array(2), Array(1)]
0: Array(2)
0: {product: {…}, quantity: null}
1: {product: {…}, quantity: null}
length: 2
[[Prototype]]: Array(0)
1: Array(1)
0: {product: {…}, quantity: null}
length: 1
[[Prototype]]: Array(0)
length: 2
[[Prototype]]: Array(0)
可能是什么原因导致的,我该如何解决?
我正在使用另一个页面的 history.push() 访问该页面,但是我传递的 none 个状态影响了获取过程,只有一些与我的数据无关的段落的显示正在获取。
我会这样写:
const getProduct = async (data) => {
try {
const response = await productServices.getProductsByTakeoffWizardStep(data);
return response.data;
} catch (error) {
console.log(error.response);
}
}
const getTakeoffIDs = () => {
takeoffServices
.getTakeoffSteps(5)
.then(async (response) => {
// try moving setSteps(), setStepsID() and setStepSequence() up here, so they don't wait for the products.
const products = await Promise.all(
response.data.map(element => getProduct({
StepID: element.stepID,
TakeoffID: 4
}))
);
setRows((rows) => [
...rows,
...products
]);
setSteps((steps) => [
...steps,
...response.data.map(element => element.description)
]);
setStepsID((stepsID) => [
...stepsID,
...response.data.map(element => element.stepID)
]);
setStepSequence((stepSequence) => [
...stepSequence,
...response.data((_, i) => `Step ${i + 1}`)
]);
})
.catch((error) => {
console.log(error.response);
});
};
useEffect(() => {
setSteps([]);
setStepsID([]);
setRows([]);
getTakeoffIDs();
}, []);
- 我没有多次调用所有这些
setState()
,而是 Array.map()
数据并一次性添加。
await
对于 all getProduct()
调用完成并立即推送它们;按顺序。
我不确定的一件事是您是否希望 setRows()
与另一个 setter 一起调用,或者其他的是否应该先调用(因为数据是available) 并且 setRows()
应在数据可用后立即调用。
我试图用多个对象数组填充一个数组,但在第一次渲染时,数组中的值被反向填充,刷新后它们又回到它们应该的样子。
const getProducts = async (data) => {
await productServices
.getProductsByTakeoffWizardStep(data)
.then((response) => {
setRows((rows) => [...rows, response.data]);
})
.catch((error) => {
console.log(error.response);
});
};
const getTakeoffIDs = () => {
var i = 1;
takeoffServices
.getTakeoffSteps(5)
.then((response) => {
response.data.forEach((element) => {
setSteps((steps) => [...steps, element.description]);
setStepsID((stepsID) => [...stepsID, element.stepID]);
var data = { StepID: element.stepID, TakeoffID: 4 };
getProducts(data);
setStepSequence((stepSequence) => [
...stepSequence,
"Step " + i + "",
]);
i = i + 1;
});
})
.catch((error) => {
console.log(error.response);
});
};
useEffect(() => {
setSteps([]);
setStepsID([]);
setRows([]);
getTakeoffIDs();
}, []);
所以首先渲染数组看起来像这样
(2) [Array(1), Array(2)]
0: Array(1)
0: {product: {…}, quantity: null}
length: 1
[[Prototype]]: Array(0)
1: Array(2)
0: {product: {…}, quantity: null}
1: {product: {…}, quantity: null}
length: 2
[[Prototype]]: Array(0)
length: 2
[[Prototype]]: Array(0)
刷新页面后看起来像这样
(2) [Array(2), Array(1)]
0: Array(2)
0: {product: {…}, quantity: null}
1: {product: {…}, quantity: null}
length: 2
[[Prototype]]: Array(0)
1: Array(1)
0: {product: {…}, quantity: null}
length: 1
[[Prototype]]: Array(0)
length: 2
[[Prototype]]: Array(0)
可能是什么原因导致的,我该如何解决?
我正在使用另一个页面的 history.push() 访问该页面,但是我传递的 none 个状态影响了获取过程,只有一些与我的数据无关的段落的显示正在获取。
我会这样写:
const getProduct = async (data) => {
try {
const response = await productServices.getProductsByTakeoffWizardStep(data);
return response.data;
} catch (error) {
console.log(error.response);
}
}
const getTakeoffIDs = () => {
takeoffServices
.getTakeoffSteps(5)
.then(async (response) => {
// try moving setSteps(), setStepsID() and setStepSequence() up here, so they don't wait for the products.
const products = await Promise.all(
response.data.map(element => getProduct({
StepID: element.stepID,
TakeoffID: 4
}))
);
setRows((rows) => [
...rows,
...products
]);
setSteps((steps) => [
...steps,
...response.data.map(element => element.description)
]);
setStepsID((stepsID) => [
...stepsID,
...response.data.map(element => element.stepID)
]);
setStepSequence((stepSequence) => [
...stepSequence,
...response.data((_, i) => `Step ${i + 1}`)
]);
})
.catch((error) => {
console.log(error.response);
});
};
useEffect(() => {
setSteps([]);
setStepsID([]);
setRows([]);
getTakeoffIDs();
}, []);
- 我没有多次调用所有这些
setState()
,而是Array.map()
数据并一次性添加。 await
对于 allgetProduct()
调用完成并立即推送它们;按顺序。
我不确定的一件事是您是否希望 setRows()
与另一个 setter 一起调用,或者其他的是否应该先调用(因为数据是available) 并且 setRows()
应在数据可用后立即调用。