简体   繁体   English

FlatList 不会在数据更改时重新渲染

[英]FlatList is not rerendering upon data change

I have an array of conversations and a function that checks if the recipient is online.我有一系列对话和一个检查收件人是否在线的功能。 However when that function changes its return value (boolean), the flatlist does NOT rerender.但是,当该函数更改其返回值(布尔值)时,平面列表不会重新呈现。 I tried extraData but with no luck.我尝试了 extraData 但没有运气。 My code is:我的代码是:

flatList平面列表

        <FlatList
              data={conversations}
              extraData={isRefreshing}
              renderItem={(conversation) => (
                <TouchableOpacity
                  onPress={() => selectConversation(conversation.item)}
                  style={{
                    flexDirection: "row",
                    justifyContent: "space-between",
                    alignItems: "center",
                    borderBottomWidth: 1,
                    padding: 5,
                    marginBottom: 5,
                  }}
                >
                  <View>
                    <Text>{getRecipient(conversation.item).displayName}</Text>
                    <Text>{conversation.item.latestMessage}</Text>
                  </View>
                  {isUserOnline(conversation.item) && (
                    <Text style={{ color: "green" }}>ONLINE</Text>
                  )}
                </TouchableOpacity>
              )}
              keyExtractor={(item) => item._id}
            />

useEffect使用效果

  useEffect(() => {
    let handler = (data) => {
      console.log(data);
      setOnlineUsers((prevState) => {
        return data;
      });
      setRefreshing(!isRefreshing);
    };
    const unsubscribe = navigation.addListener("focus", () => {
      console.log("focused");
      socket.on("online-users-data", handler);
      socket.emit("join-online-users");
      getConversations();
    });

    return () => {
      socket.emit("leave-online-users");
      socket.off("online-users-data", handler);
      unsubscribe();
    };
  }, []);

isUserOnline() isUserOnline()

  function isUserOnline(conversation) {
    const user = getRecipient(conversation);
    const onlineUser = onlineUsers.find((u) => u.userId === user._id);

    return (
      user && onlineUser && user._id.toString() === onlineUser.userId.toString()
    );
  }

I have solved this by adding onlineUsers to extraData .我通过将onlineUsers添加到extraData解决了这个问题。 Damn it was confusing.该死的令人困惑。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM