即使数据在数组中,React Native array.length 也会给我 0

Posted

技术标签:

【中文标题】即使数据在数组中,React Native array.length 也会给我 0【英文标题】:React Native array.length gives me 0 even when data is in array 【发布时间】:2022-01-23 01:37:09 【问题描述】:

我在一些看似简单得可笑的事情上遇到了麻烦,我不敢相信我不得不这样做。

我有一个数组messages: Message[] = [...],我需要遍历它。但是,循环/映射没有发生。我已经尝试了我所知道的各种迭代,但似乎都不起作用。

这是我的代码:

const getMessages = (messages: Message[]) => 
  const cards = []
  // eslint-disable-next-line no-console
  console.log("Test 1: ", messages);
  // eslint-disable-next-line no-console
  console.log("Test 2: ", messages.length);
  // eslint-disable-next-line no-console
  console.log("Test 3: ", messages[0]);
  let i = 0;
  for (const msg of messages) 

    // eslint-disable-next-line no-console
    console.log("ADD TO LIST");
    cards.push(
      <MessageSummary
        key=i
        council=msg.council
        latestMessage=msg.content
        date=msg.date"
        hasBeenRead=false
      />
    );
    i += 1;
  ;
  if (cards.length > 0) 
    return messages;
  
  return (
    <Text style=styles.noApplicationsMessage>
      You don&apos;t have any messages yet
    </Text>
  );
;

在我的终端中,这是输出:

如您所见,当我登录messages 时,它会正确输出数据,但如果我尝试检查长度或访问元素,它就不起作用。

编辑

在这里我调用我的数据库以获取 messages 数据。

const processNewMessages = useCallback((newMessages: Message[]) => 
    setMessages(newMessages);
  , []);

  useFocusEffect(
    useCallback(() => 
      if (userExternalId < 0) 
        return;
      
      setLoading(true);
      getMessages(userExternalId)
        .then((messagesQuery) => processNewMessages(messagesQuery))
        .catch(() => 
          setError("Messages could not be fetched. Please try again later.");
          setShowBanner(true);
        )
        .finally(() => 
          setLoading(false);
        );
    , [processNewMessages, userExternalId])
  );

感谢任何可以提供帮助的人,谢谢。

【问题讨论】:

你能详细说明一下什么是 userExternalId 类型,虽然它看起来不像一个数组。 【参考方案1】:

数组总是通过引用调用。当你安慰这三个人时,

    messages 最初是空数组// 通过引用调用 因此 messages.length 为 0 //按值调用 因此 messages[0] 未定义。 //按值调用

但由于 console.log(messages) 是通过引用调用的,它稍后会更新为正确的数据,但其他 2 个控制台没有更新。

看起来您传递的消息数组来自异步调用,请尝试使用异步等待并仅在消息数据到达时调用该函数。

【讨论】:

您好,感谢您的评论。所以messages 数据来自我的数据库。我在一个屏幕上使用useFocusEffect 来获取这些数据,这是一个承诺。但没有意义的是,我在应用程序的不同部分采用完全相同的方法,但效果很好。 你能从你做这个api调用和调用这个函数的地方添加那部分的代码吗?也许这可以帮助找到问题。 我已经添加了上面的代码,getMessages() 函数只是查询数据库,并返回一个Message[]。它是异步的。

以上是关于即使数据在数组中,React Native array.length 也会给我 0的主要内容,如果未能解决你的问题,请参考以下文章

即使设置为 false,使用条件渲染的 React Native 仍然尝试访问状态

react native - 如何在元组数组中使用 React Hooks?

React / React Native:如何映射数组并在卡片上显示数据

即使在调试中,React Native 测试库也找不到文本

即使我在 node_modules 中看到私有 react-native 库也突然找不到

通过React Native显示JSON数据-json数组