データベースからコンポーネントの状態でリストの一番上に新しいアイテムを追加します

ビクターモリーナ

アプリにデータベースリスナーがあり、ユーザーが何かを投稿するたびにデータの状態を更新します。新しい投稿を取得したら、FlatListがレンダリングするすべてのアイテムを含む配列である「posts」という状態を更新します。

問題は、状態を更新した後、(リストのフッターに)下がってから一番上に戻るまで、リストの一番上に新しい投稿が表示されないことです。

私のFlatListコードは次のとおりです。

 const keyExtractor = ({id}) => id

 ...

 const renderItem = ({ item }) => {
    const {
      uri,
      description,
      location,
      width,
      height,
      likes,
      comments,
      date,
    } = item;

    return (
      <Card
        uri={uri}
        description={description}
        location={location}
        width={width}
        height={height}
        likes={likes}
        date={date}
      />
    );
  };

  return (
    <FlatList
      data={data} // data is the post state of the parent
      renderItem={renderItem}
      keyExtractor={keyExtractor}
      initialNumToRender={15}
      windowSize={WINDOW_HEIGHT * 2}
      maxToRenderPerBatch={15}
      updateCellsBatchingPeriod={50}
      removeClippedSubviews={false}
      ListFooterComponent={
        isLoading ? (
          <View style={styles.footer}>
            <Loading type="ios" size={18} color={colors.gray} />
          </View>
        ) : null
      }
    />
  );
}

そして、これは私が投稿の状態を更新する方法です(フラットリストの親コンポーネントで)

function Posts(props) {
  const [posts, setPosts] = useState([]);

  useEffect(() => {
    const { firebase } = props;

    let postsArray = [];

    // Realtime database listener
    const unsuscribe = firebase
      .getDatabase()
      .collection("posts")
      .doc(firebase.getCurrentUser().uid)
      .collection("userPosts")
      .orderBy("date") // Sorted by upload date
      .onSnapshot((snapshot) => {
        let changes = snapshot.docChanges();

        changes.forEach((change) => {
          if (change.type === "added") {
            // Get the new post
            const newPost = change.doc.data();

            // Add the new post to the posts list
            postsArray.unshift(newPost);
          }
        });

        // Reversed order so that the last post is at the top of the list
        setPosts(postsArray);
      });

    /* Pd: At the first time, this function will get all the user's posts */

    return () => {
      // Detach the listening agent
      unsuscribe();
    };
  }, []);

  return (
    <View style={styles.container}>
      <CardList data={posts} />
    </View>
  );
}
イェフゲン・ゴルブンコフ

この問題は、新しい投稿を追加することで発生する可能性があります。

postsArray.unshift(newPost)
..
setPosts(postsArray)

の参照には影響しないようですpostsArrayしたがって、状態の更新は発生せず、再レンダリングも見られません

代わりに、次のことを試してみてください。

setPosts([...postsArray])

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Androidのsqliteデータベースからのリストビューのリストの一番上に新しいアイテム

分類Dev

新しいアイテムを追加すると、リストビューが一番上にジャンプします

分類Dev

新しいアイテムを追加すると、RecyclerViewスクロールがリストの一番上に戻ります

分類Dev

データベースからデータをフェッチし、React.js コンポーネントの状態として設定します

分類Dev

ReactとReduxを使用してカスタムコンポーネントからアプリの状態を更新することはできません

分類Dev

カスタムjQueryアコーディオン-アクティブなパネルの一番上までスクロールします

分類Dev

リスト内のビューから特定のアイテムをコントローラーに戻し、データベースを更新します

分類Dev

反応コンポーネントをデータベースの状態にバインドするにはどうすればよいですか?

分類Dev

コンテキストなしで機能コンポーネントの状態を上向きに渡す

分類Dev

Parentクラスから渡されたイベントハンドラーで子コンポーネントの状態を条件付きで更新します

分類Dev

子コンポーネントから状態を更新するときに、親のマウントステータスを確認します

分類Dev

React / Reduxは、ストアを使用して別のコンポーネントから状態を取得します

分類Dev

ユーザーエントリを含む要素をリストの一番上に追加します

分類Dev

ボタンの状態に基づいてカスタムコンポーネントに移動します

分類Dev

リストの一番上に追加する方法と、同じ場合はデータベースを介して1回だけですか?

分類Dev

一番上のcodenameoneの最初のコンポーネントの前にカスタマイズされたツールバーを追加するにはどうすればよいですか?

分類Dev

vuexの状態に基づいてコンポーネントデータをリロードします

分類Dev

Javaで上書きする代わりに、あるディレクトリから別のディレクトリにファイルをコピーし、タイムスタンプ付きの新しいファイルを追加します

分類Dev

リアクティブフォームのFormGroupにカスタムコンポーネントを追加する正しい方法は何ですか?

分類Dev

ネイティブスクリプト/ AngularAndroidでsqliteデータベースをどのようにインポート/エクスポートしますか?

分類Dev

ストアの状態をreact-reduxのコンポーネントにバインドできますか?

分類Dev

Reactコンポーネントの機能で新しいREDUX状態にアクセスする

分類Dev

リストアイテムをレンダリングしてから、一番下までスクロールします

分類Dev

React:非同期データで親から子コンポーネントの状態を更新します

分類Dev

Redisはアイテムをリストの中央から一番上に移動します

分類Dev

ReactJSコンポーネントの状態は、jest /酵素テストで正常に設定された後でも、空のデータを返します

分類Dev

レデューサー状態でネストされたデータ構造に新しいアイテムを追加する

分類Dev

Angular2:コンポーネント内のhtml要素の参照を取得し、そのhtml要素の一番上までスクロールします

分類Dev

何が一番いいですか?ソケットでポーリングしますか、それともWebサービスのタイムアウトを待ちますか?

Related 関連記事

  1. 1

    Androidのsqliteデータベースからのリストビューのリストの一番上に新しいアイテム

  2. 2

    新しいアイテムを追加すると、リストビューが一番上にジャンプします

  3. 3

    新しいアイテムを追加すると、RecyclerViewスクロールがリストの一番上に戻ります

  4. 4

    データベースからデータをフェッチし、React.js コンポーネントの状態として設定します

  5. 5

    ReactとReduxを使用してカスタムコンポーネントからアプリの状態を更新することはできません

  6. 6

    カスタムjQueryアコーディオン-アクティブなパネルの一番上までスクロールします

  7. 7

    リスト内のビューから特定のアイテムをコントローラーに戻し、データベースを更新します

  8. 8

    反応コンポーネントをデータベースの状態にバインドするにはどうすればよいですか?

  9. 9

    コンテキストなしで機能コンポーネントの状態を上向きに渡す

  10. 10

    Parentクラスから渡されたイベントハンドラーで子コンポーネントの状態を条件付きで更新します

  11. 11

    子コンポーネントから状態を更新するときに、親のマウントステータスを確認します

  12. 12

    React / Reduxは、ストアを使用して別のコンポーネントから状態を取得します

  13. 13

    ユーザーエントリを含む要素をリストの一番上に追加します

  14. 14

    ボタンの状態に基づいてカスタムコンポーネントに移動します

  15. 15

    リストの一番上に追加する方法と、同じ場合はデータベースを介して1回だけですか?

  16. 16

    一番上のcodenameoneの最初のコンポーネントの前にカスタマイズされたツールバーを追加するにはどうすればよいですか?

  17. 17

    vuexの状態に基づいてコンポーネントデータをリロードします

  18. 18

    Javaで上書きする代わりに、あるディレクトリから別のディレクトリにファイルをコピーし、タイムスタンプ付きの新しいファイルを追加します

  19. 19

    リアクティブフォームのFormGroupにカスタムコンポーネントを追加する正しい方法は何ですか?

  20. 20

    ネイティブスクリプト/ AngularAndroidでsqliteデータベースをどのようにインポート/エクスポートしますか?

  21. 21

    ストアの状態をreact-reduxのコンポーネントにバインドできますか?

  22. 22

    Reactコンポーネントの機能で新しいREDUX状態にアクセスする

  23. 23

    リストアイテムをレンダリングしてから、一番下までスクロールします

  24. 24

    React:非同期データで親から子コンポーネントの状態を更新します

  25. 25

    Redisはアイテムをリストの中央から一番上に移動します

  26. 26

    ReactJSコンポーネントの状態は、jest /酵素テストで正常に設定された後でも、空のデータを返します

  27. 27

    レデューサー状態でネストされたデータ構造に新しいアイテムを追加する

  28. 28

    Angular2:コンポーネント内のhtml要素の参照を取得し、そのhtml要素の一番上までスクロールします

  29. 29

    何が一番いいですか?ソケットでポーリングしますか、それともWebサービスのタイムアウトを待ちますか?

ホットタグ

アーカイブ