【发布时间】:2021-08-20 20:42:05
【问题描述】:
我仍在为 React Natives 的渲染顺序而苦苦挣扎。我正在获取 API,然后过滤这些数据,最后我正在操作数据。当我第一次加载应用程序时,它没有正确显示数据,只有当我在我的代码编辑器中保存时它才会显示。
我的简化代码:
const [data, setData] = useState([]);
const [sumPost, setSumPost] = useState(0);
const [sumProd, setSumProd] = useState(0);
useEffect(() => {
const unsubscribe = db.collection("Dates").where("projektName", "==", Projektname).onSnapshot(snapshot => (
setData(
snapshot.docs.map((doc) => ({
id: doc.id,
data: doc.data(),
})))
))
return unsubscribe;
}, [])
const produktionsFilter = data.filter( x =>
x.data.jobtype == "Produktion"
);
const postFilter = data.filter( x =>
x.data.jobtype == "Postproduktion"
);
const terminFilter = data.filter( x =>
x.data.jobtype == "Termin"
);
let i;
const addPostProdTage = () => {
const post = [];
const prod = [];
for(i=0; i < postFilter.length; i++){
const p = postFilter[i].data.alleTage.length;
post.push(p)
}
for(i=0; i < produktionsFilter.length; i++){
const l = produktionsFilter[i].data.alleTage.length;
prod.push(l)
}
setSumPost(post.reduce(function(a, b){
return a + b;
}, 0));
setSumProd(prod.reduce(function(a, b){
return a + b;
}, 0));
}
useEffect(() => {
addPostProdTage();
}, [])
return(
<View>
<Text>{sumPost}</Text>
<Text>{sumProd}</Text>
</View>
)
sumProd 应该是 18,sumPost 应该是 3。现在两者都显示为 0,因为这两个状态最初都是空数组。它需要某种形式的刷新。
我敢肯定,有更有效的编码方法,但我需要帮助来理解为什么我的数据在我第一次加载应用程序时没有正确显示,因为我一遍又一遍地遇到这个问题.
【问题讨论】:
-
我认为你在 state 中放错了变量,请将
sumPost和sumProd放入 state 中,然后在计算后调用钩子函数(可能是setSumPost和setSumProd) -
谢谢!我现在明白不要创建局部变量,而是使用 useStates。
-
如果你想重新渲染,你需要在你的代码中使用钩子函数来改变状态。我认为您可以通过仅使用一个同时具有
sumPost和sumProd属性的对象来优化您的代码,并在完成计算以更新sumPost和sumProd后调用钩子函数,您可能不需要useStates 用于其他变量。 -
@ArminGhoreishi 感谢您的回复。我差点把我的电脑扔出窗外。我仍然无法让它工作。我创建了两个状态(sumProd 和 sumPost),我有一个函数,它通过 API 数组并将特定值推送到一个新数组中,以便我可以计算这些特定值的总和。并且需要显示该总和。它仍然是“0”,初始值并且没有更新......我更新了这个问题,如果你指出我正在犯的初学者级别的错误,那将是非常好的,这样我就可以避免这些错误了一遍又一遍!
-
看,
data还没有准备好,当你进行过滤和计算时,我认为你正在过滤一个空数组,请确保data填充了数据正在调用addPostProdTage函数。您可能需要在onSnapshot回调中进行过滤和计算过程。
标签: javascript react-native api rendering