【问题标题】:How to append data when fetching a second time第二次获取时如何追加数据
【发布时间】:2021-01-27 11:37:27
【问题描述】:

当我第二次调用我的 fetch 方法时,我无法附加我的数据。在初始渲染时,我的组件从我的数据库中获取数据并将其存储在我的 followingData 状态中。然后,当我滚动到底部时,我再次调用我的 fetchData 函数,但不是将我的新数据附加到以下数据状态,而是替换它,现在我的屏幕上只显示新数据。

代码如下:

function Following({route, navigation}) {
  const [followingData, setfollowingData] = useState([]);
  const [loading, setLoading] = useState(true);
  const [lastVisible, setLastVisible] = useState();

  const fetchData = () => {
    const dataaRef = firestore().collection('usernames');
    const dataRef = firestore().collection('usernames');

    dataRef
      .doc(route.params.username.toLowerCase())
      .collection('Following')
      .onSnapshot(() => {
        dataaRef
          .doc(route.params.username.toLowerCase())
          .collection('Following')
          .orderBy('followedAt')
          .startAfter(lastVisible || 0)
          .limit(7)
          .get()
          .then((snapshot) => {
            snapshot.empty
              ? null
              : setLastVisible(
                  snapshot.docs[snapshot.docs.length - 1].data().followedAt,
                );
            let promises = [];
            snapshot.forEach((doc) => {
              const data = doc.data();
              promises.push(
                data.path.get().then((res) => {
                  const userData = res.data();
                  return {
                    profileName: doc.id ? doc.id : null,
                    displayName: userData.displayName
                      ? userData.displayName
                      : null,
                    followerCount:
                      userData.followers !== undefined ? userData.followers : 0,
                    followingCount:
                      userData.following !== undefined ? userData.following : 0,
                    imageUrl: userData.imageUrl ? userData.imageUrl : null,
                  };
                }),
              );
            });
            Promise.all(promises).then((res) => {
              setfollowingData(res);
            });
            setLoading(false);
          });
      });
  };

  useEffect(() => {
    const dataRef = firestore().collection('usernames');

    const cleanup = fetchData();

    return cleanup;
  }, [route.params.username]);

  return (
    <>
      <View
        style={styles}>
        <TouchableOpacity onPress={() => navigation.openDrawer()}>
          <Icon name="menu" color="#222" size={30} />
        </TouchableOpacity>
        <Text style={{left: width * 0.05}}>Following</Text>
      </View>

      {loading ? (
        <ActivityIndicator size="large" color="black" />
      ) : (
        <>
          <FolloweringScreens
            data={followingData}
            screen={'Following'}
            username={route.params.username}
            navigation={navigation}
            fetchData={fetchData}
          />
        </>
      )}
    </>
  );
}

export default Following;

子组件看起来像这样,当滚动到末尾时会调用 fetchData:

function FolloweringScreens({
  data,
  screen,
  username,
  navigation,
  fetchData,
  setNext,
}) {

  return (
    <>
      <FlatList
        scrollEnabled={true}
        onEndReachedThreshold={0}
        onEndReached={fetchData} <<-- CALLING FETCHDATA AGAIN TO GET MORE DATA
        data={data}
        keyExtractor={(i, index) => index.toString()}
        renderItem={({item, index}) => {
          return (
                  (I use my data here)
          );
        }}
      />
    </>
  );
}

export default FolloweringScreens;

【问题讨论】:

    标签: reactjs firebase google-cloud-firestore


    【解决方案1】:

    如果您只想追加新数据,那么最好在 setState 中使用callback function

    Promise.all(promises).then(res => {
      setfollowingData(oldState => ({...oldState, ...res}));
    });
    

    在这里,您从旧状态中获取所有值,将其放入一个新对象中,然后将新数据添加到其中。如果您的状态是一个数组,则必须将 {}[] 进行交换:

    Promise.all(promises).then(res => {
      setfollowingData(oldState => ([...oldState, ...res]));
    });
    

    更新:添加示例

    【讨论】:

    • 这样返回数据:{"0": {First set of data}, "1": {second set of data}, "2": {second set of data}, "3 ": {second set of data}, "4": {second set of data}} 但我需要数组中的数据,所以我可以在 flatlLst 中使用它。
    • 这就是为什么你应该把花括号换成数组的。我会更新我的答案。
    • 你确定它是一个对象数组吗?错误消息听起来像是别的东西。您可以控制台记录响应并将其添加到您的问题中吗?
    • 好的,但是您总是收到一个数组返回,因此在这种情况下错误消息没有意义。为了解决函数快速触发的问题,您可以构建一个 debounce 函数:freecodecamp.org/news/javascript-debounce-example
    • 我真是个白痴。所以我收到这个错误的原因是因为初始状态是空的。将初始状态更改为 [] 后,它现在可以工作了。很抱歉浪费您的时间,非常感谢您的帮助,不胜感激,谢谢先生!!!
    猜你喜欢
    • 2015-05-26
    • 1970-01-01
    • 2014-06-16
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多