【问题标题】:posts are not in order. want to show latest post at top first帖子不按顺序排列。想在顶部显示最新的帖子
【发布时间】:2021-11-29 16:04:02
【问题描述】:

我正在制作一个 facebook 克隆,在我的主页 Feed 上,我想显示所有帖子,此代码显示帖子但不按顺序显示,想首先显示最新帖子。
但现在这显示(旧帖子(已加载)按降序显示,然后所有新帖子按正确顺序显示)

homeFeed.js

import React ,{useState,useEffect} from 'react'
import './stylesheets/HomeFeed.css';
import HomeReels from './HomeReels'
import CreatePost from './CreatePost';
import Post from './Post';
import { ref, onValue} from "firebase/database";
import { realtimedb } from '../firebaseConfiguration';

export default function HomeFeed() {
    const [postdata, setpostdata] = useState([])
 
       
        const starCountRef =  ref(realtimedb, 'Posts/');
        // get post from realtime database
          
        useEffect(()=>{
            onValue(starCountRef, async (snapshot) => {
                const data = snapshot.val();
                          var captions=[];

//data is stored in raltime db firebase as ----> Post > uid > timestamp >{caption:"captions"}    
                        //  conver objects to  array , to store strings in final array data structure is in realtimedb > post > {uid:{time:{caption:"caption}}}
                        (Object.values(data)).forEach((e)=>{
                                (Object.values(e)).forEach((p)=>{
                                    captions.unshift(p.caption)
                                })
                        });
                       
                                setpostdata(captions)
                });
     
        },[])
        // make  Post components
            const postRender = postdata.map((e)=>{
                return<>
                <Post caption={e}/>
                </>
            })


   
    return (
        <div className='HomeFeed'>
                <HomeReels  />
                <CreatePost />
               {postRender}
        </div>
    )
}

post.js

使用标题作为发布数据并将其作为道具接收

【问题讨论】:

  • 错误是什么
  • 添加一些状态变量以确保加载过程完成。之后挂载你的组件

标签: javascript reactjs firebase-realtime-database


【解决方案1】:

这条注释掉的行实际上是你应该这样做的:

// const [postdatabeforeload, setpostdatabeforeload] = useState([])

如果没有useStatesetState,您的渲染代码会在从数据库加载数据之前运行,因此它会渲染您最初设置的空数组:var postdata=[]

通过使用useState/setState,您告诉 ReactJS 数据已更改,这会触发它以更新的状态重新呈现 UI。

比如:

const [postdata, setpostdata] = useState([])

const starCountRef = ref(realtimedb, 'Posts/');
useEffect(() => {
  onValue(starCountRef, async (snapshot) => {
    const captions = [];
    snapshot.forEach((child) => { 
        captions.push(child.val().caption);
    });
    setpostdata(data)
  });
}, [])

useEffect 执行之前,您的postdata 将具有其默认值[],因为这是您在此处指定的[postdata, setpostdata] = useState([])

然后,一旦数据加载完毕,您将获得字幕数组。

另见:

【讨论】:

  • 非常感谢
  • 问题是最后添加了新数据(标题),因此旧帖子位于顶部。我使用了 unshift 方法而不是 push,旧数据也不会改变顺序。只有新添加的数据可以。所以顺序是(以前加载的数据按降序排列,之后新添加的数据按正确的顺序)
  • 我分享的代码每次都以一个空的captions开头,正是为了防止这个问题的发生。你确定你是按原样使用的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多