Firebase firestore onSnapshot 在 useEffect 中无法正常工作

Posted

技术标签:

【中文标题】Firebase firestore onSnapshot 在 useEffect 中无法正常工作【英文标题】:Firebase firestore onSnapshot not working properly in useEffect 【发布时间】:2021-09-27 16:05:40 【问题描述】:

我在使用 firebase 时遇到了一些问题,我正在使用 firestore onSnapshot 在 useEffect 中获取实时更新,如下所示:

  useEffect(() => 
  const unsubscribe = () => 
    firebase
      .firestore()
      .collection("posts")
      .orderBy("createdAt", "desc")
      .onSnapshot((post) => 
        const data = post.docs.map((doc) => (
          id: doc.id,
          ...doc.data(),
        ));
        setPosts(data);
        setLoading(false);
      );
  ;
  return () => unsubscribe();
, []);

但是它不起作用,当组件挂载时我没有得到数据,奇怪的事实是,当我使用它而不返回取消订阅功能时,它可以完美地工作。像这样:

useEffect(() => 
firebase
  .firestore()
  .collection("posts")
  .orderBy("createdAt", "desc")
  .onSnapshot((post) => 
    const data = post.docs.map((doc) => (
      id: doc.id,
      ...doc.data(),
    ));

    setPosts(data);
    setLoading(false);
  );

, []);

我真的很想知道为什么第一种方法不起作用,这是理想的方法。我也在使用 React Router DOM,在这里你可以看到我的 Posts 组件,它在我获取数据时呈现一个 Post 组件。

     export default function Posts() 
      const [posts, setPosts] = useState([]);
      const [loading, setLoading] = useState(true);
    
    
      useEffect(() => 
        console.log("data listener...");
        const unsubscribe = () => 
          firebase
            .firestore()
            .collection("posts")
            .orderBy("createdAt", "desc")
            .onSnapshot((post) => 
              console.log("el console desde posts listeners..");
              const data = post.docs.map((doc) => (
                id: doc.id,
                ...doc.data(),
              ));
              setPosts(data);
              setLoading(false);
            );
        ;
        return () => unsubscribe();
      , []);
//Not working
    
      return (
        <main className="posts">
          loading && <h3>Loading posts...</h3>
          posts && posts.map((post) => <Post ...post key=post.id />)
        </main>
      );
    

这个 Posts 组件正在被渲染:

  export default function Home() 
  return (
    <div className="home">
      <Nav />
      <Posts />
    </div>
  );

【问题讨论】:

【参考方案1】:

这是因为您的侦听器被包装在另一个函数的一侧,因此除非您调用 unsubscribe 函数,否则它不会被调用。

const unsubscribe = () =>  firebase.collection("posts").... 

试试这个

const unsubscribe = firestore.collection("posts")....

// now calling, unsubscribe() will detach the listenter

【讨论】:

以上是关于Firebase firestore onSnapshot 在 useEffect 中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

@firebase/firestore:Firestore (8.6.5):无法访问 Cloud Firestore 后端

使用Firestore需要firebase-firestore.js文件吗?

无法在firebase.firestore.CollectionReference中使用Array firebase.firestore.Query为什么?

(firebase.firestore 不是函数)尝试在 Firestore 中创建集合时

Firestore 配置 - Firebase

firebase2.default.firestore 不是一个函数 - React Firebase