【问题标题】:Why is my data not rendering appropriately?为什么我的数据没有正确呈现?
【发布时间】: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 中放错了变量,请将 sumPostsumProd 放入 state 中,然后在计算后调用钩子函数(可能是 setSumPostsetSumProd
  • 谢谢!我现在明白不要创建局部变量,而是使用 useStates。
  • 如果你想重新渲染,你需要在你的代码中使用钩子函数来改变状态。我认为您可以通过仅使用一个同时具有sumPostsumProd 属性的对象来优化您的代码,并在完成计算以更新sumPostsumProd 后调用钩子函数,您可能不需要useStates 用于其他变量。
  • @ArminGhoreishi 感谢您的回复。我差点把我的电脑扔出窗外。我仍然无法让它工作。我创建了两个状态(sumProd 和 sumPost),我有一个函数,它通过 API 数组并将特定值推送到一个新数组中,以便我可以计算这些特定值的总和。并且需要显示该总和。它仍然是“0”,初始值并且没有更新......我更新了这个问题,如果你指出我正在犯的初学者级别的错误,那将是非常好的,这样我就可以避免这些错误了一遍又一遍!
  • 看,data 还没有准备好,当你进行过滤和计算时,我认为你正在过滤一个空数组,请确保data 填充了数据正在调用addPostProdTage 函数。您可能需要在onSnapshot 回调中进行过滤和计算过程。

标签: javascript react-native api rendering


【解决方案1】:

感谢我在这里得到的所有建议,所以为了将来参考,这就是我解决这个问题的方法:

我过滤了快照中的数据:

useEffect(() => {
    const post = db
      .collection("Dates")
      .where("projektName", "==", Projektname)
      .where("jobtype", "==", "Postproduktion")
      .onSnapshot((snapshot) =>
        setPost(
          snapshot.docs.map((doc) => ({
            id: doc.id,
            data: doc.data(),
          }))
        )
      );
    return post;
  }, []);

我有不必要的步骤来进行计算。我可以将其简化为一个函数:

const revData = () => {
    setSumPost(
      post.reduce(function (prev, cur) {
        return prev + cur.data.alleTage.length;
      }, 0)
    );
  };

最后,我有一个 useEffect 在使用依赖数组获取数据后调用该函数:

useEffect(() => {
    revData();
  }, [post]);

【讨论】:

    【解决方案2】:

    您正在创建超出范围的局部变量。如果您使用 typescript 而不是 javascript,您将能够捕获此错误。

    您想改为创建这样的状态对象:

      const [sumPost, setSumPost] = useState(0)
      const [sumProd, setSumProd] = useState(0);
    

    然后如图所示设置那些对象的值:

        setSumPost(postproduktionsTage.reduce(function(a, b){
          return a + b;
        }, 0));
    
        setSumProd(produktionsTage.reduce(function(a, b){
          return a + b;
        }, 0));
    

    然后你就可以随心所欲地使用它了:

    return(
    <View>
       <Text>{sumPost}</Text>
       <Text>{sumProd}</Text>
    </View>
    )
    

    【讨论】:

    • 有道理!我在最初的问题中更新了代码,因为现在,我想由于两个 setStates,我有太多的重新渲染,对吗?我怎样才能避免这个错误,所以我明白了吗?感谢您的帮助!
    • 有很多方法可以做到这一点,如下所示:stackoverflow.com/a/62320075/11104068
    • ""状态"是只读的"。我正在慢慢放弃......我想我还没有理解渲染顺序的整个概念如何控制它。我可以优化我在问题中发布的代码中的某些内容来解决这个问题吗?非常感谢您的帮助!
    • 我不确定你在说什么。在这里,看看我为您创建的这个示例:snack.expo.dev/@saamerm/stackoverflow-answer 这是您的代码的简化版本,因此您可以了解发生了什么
    • 感谢您花时间创建该示例!我发布了一种摘要答案以供将来参考!
    猜你喜欢
    • 2021-10-20
    • 2014-08-12
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多