【问题标题】:TypeError: Cannot read properties of undefined (reading 'profilePic'), reactTypeError:无法读取未定义的属性(读取“profilePic”),做出反应
【发布时间】:2021-12-25 13:13:59
【问题描述】:

我 我正在尝试从 Firestore 云中获取数据,但出现错误“TypeError:无法读取未定义的属性(正在读取'profilePic')” 为什么说是未定义,却是已定义?

  import React, {useState, useEffect} from 'react';
  import Post from './Post';
   import db from '../firebase';
  
  const Feed = ({profilePic, message, timestamp, username, image}) => {
  const [posts, setPosts]  =useState([]);

  //realtime database connection
  useEffect(() => {
  db.collection('posts')
 .orderBy('timestamp','desc')
 .onSnapshot((snap) => (
  setPosts(snap.docs.map((doc) => ({...doc.data(), id: doc.id })))
  ));
   }, []);
    
   return (
    <div className='feed'>
      {posts.map((post)=>(
        <Post
        key={post.id}
        profilePic={post.data.profilePic}
        message={post.data.message}
        timestamp={post.data.timestamp}
        username={post.data.username}
        image={post.data.image}
        />
      ))}
    </div>
   );
  }

  export default Feed;

【问题讨论】:

    标签: reactjs firebase-realtime-database react-hooks


    【解决方案1】:

    您正尝试从 未定义posts.data 中读取 profilePic。此值在 useEffect 方法中设置。

    我认为问题出在这一行

    setPosts(snap.docs.map((doc) => ({...doc.data(), id: doc.id }))).
    

    试试这个:将此代码的结果分配到一个单独的变量中,然后在控制台中查看该变量的值。检查变量中的数据是否创建正确。

    useEffect(() => {
      db.collection('posts')
     .orderBy('timestamp','desc')
     .onSnapshot((snap) => {
       let p = snap.docs.map((doc) => ({...doc.data(), id: doc.id }));
       console.log("POSTS", p) // check the value in console
       setPosts(p);
      }));
       }, []);
    

    【讨论】:

      【解决方案2】:

      试试这个: setPosts(snap.docs.map((doc) =&gt; ({ id: doc.id, data: doc.data()})))

      并添加可选链接

      {posts?.map((post)=>(
          <Post
          key={post.id}
          profilePic={post.data.profilePic}
          message={post.data.message}
          timestamp={post.data.timestamp}
          username={post.data?.username}
          image={post.data?.image}
          />
        ))}
      

      【讨论】:

      • 首先,错误不在于posts数组,这是因为post.data未定义。第二,使用?检查帖子、帖子和数据是否存在不是一个好的做法。因为 JS 引擎必须在每次迭代时进行大量相同的检查。
      • 是的,问题是因为 post.data 未定义,所以根据我使用数据的经验: doc.data 将解决这个问题,使用 ?允许如果没有任何帖子应用程序不抛出错误
      猜你喜欢
      • 2022-09-27
      • 2021-12-02
      • 1970-01-01
      • 2020-09-07
      • 2021-06-22
      • 2021-07-10
      • 2017-01-01
      • 2021-01-16
      • 2021-08-05
      相关资源
      最近更新 更多