在React中呈现一个Firestore时间戳
在React中呈现一个Firestore时间戳
我已经试了几个月来找出如何在React中显示Firestore时间戳。
在2019年12月,我在这个帖子上接受的解决方案post是可行的。但现在它不再有效。我又卡住了。
我有一个firebase.js助手来记录日期:
class Firebase { constructor() { app.initializeApp(config) this.firestore = app.firestore(); this.auth = app.auth(); this.serverTimestamp = app.firestore.FieldValue.serverTimestamp; }
我在表单中使用这个助手来记录条目创建的日期,如下所示:
await Firebase.firestore.collection("blog").doc().set({ title: values.title, createdAt: Firebase.serverTimestamp()
这样可以正确地将一个日期保存到Firestore文档中,看起来像这样:
当我悬停在日期上时,显示为'timestamp'。我可以根据createdAt日期的引用对从Firestore返回的数据进行排序 - 所以奇怪的是,时间戳可用于对文档进行排序,但不能用于在屏幕上显示日期。
当要输出日期时,我又遇到了之前报告的所有相同错误 - 但是在12月份有效的解决方案现在不再有效。我在Firebase的slack频道中看到了一次讨论,最近发布的Firebase版本有一些意外的后果 - 是否有办法检查是否是其中之一导致了时间戳无效?
当我尝试:
{currentPost.createdAt.toDate().toISOString()}
TypeError: 无法读取未定义的属性'toDate'
当我尝试:
{currentPost.createdAt.toDate()}
TypeError: 无法读取未定义的属性'toDate'
当我尝试:
{new Date(currentPost.createdAt.seconds * 1000).toLocaleDateString("en-US")}
TypeError: 无法读取未定义的属性'seconds'
当我尝试(我知道这行不通,但只是试图找到可能有助于解决这个问题的见解):
{currentPost.createdAt}
Error: 对象不能作为React子元素(找到具有键{seconds,nanoseconds}的对象)。如果您想渲染一组子元素,请使用数组。
我看到了一些帖子说日期未定义是因为firebase的调用尚未返回值,但是当我console.log整个currentPost时,我得到了一个created At的值,如下所示:
createdAt: t seconds: 1586495818 nanoseconds: 888000000
其中看起来可疑的是“t”。它代表了我应该做一些操作以访问时间戳吗?有人知道如何调查't'代表什么吗?
我看到了这个帖子和这个帖子,注意到对它的每个答案都建议使用.toDate()扩展来转换Firestore时间戳以输出。这些解决方案在这里都不起作用。
有人找到了一种当前的解决方案,可以同时保存和输出Firestore中的日期吗?
问题描述:在React中渲染Firestore的时间戳。
问题原因:Firestore的时间戳在React中无法直接渲染,需要进行处理。
解决方法:使用{data.timestamp.toDate().toLocaleTimeString("en-US")}
来将Firestore的时间戳转换为可渲染的时间格式。
文章内容如下:
在React中渲染Firestore的时间戳是一个常见的需求。然而,Firestore的时间戳并不能直接在React中进行渲染。为了解决这个问题,我们需要进行一些处理。
经过尝试,以下方法可以解决这个问题:
{data.timestamp.toDate().toLocaleTimeString("en-US")}
上述代码将Firestore的时间戳转换为可渲染的时间格式。首先,我们使用toDate()
方法将Firestore的时间戳转换为JavaScript的Date对象。然后,我们使用toLocaleTimeString("en-US")
方法将Date对象转换为指定格式的时间字符串。
通过使用上述代码,我们可以在React中渲染Firestore的时间戳了。
希望本文对你在React中渲染Firestore的时间戳有所帮助!
在React中呈现Firestore时间戳的问题是由于以下原因引起的:在使用Firestore获取文档数据时,无法直接将时间戳渲染为日期格式。解决方法是将useEffect函数改为异步函数,并在渲染时使用new Date()将时间戳转换为日期格式。
代码示例:
function ReadBlogPost () { const [loading, setLoading] = useState(true); const [currentPost, setCurrentPost] = useState({}); let { slug } = useParams(); useEffect(() => { const fetchData = async() => { try { const response = await Firebase.firestore .collection("blog") .doc(slug) .get(); console.log('response', response); let data = { title: 'not found' }; if (response.exists) { data = response.data(); } setCurrentPost(data); setLoading(false); } catch(err) { console.error(err); } }; fetchData(); }, []); return ( {!loading && new Date(currentPost.createdAt.seconds * 1000).toLocaleDateString("en-US")} ); }
以上代码中,我们首先定义了一个ReadBlogPost组件,其中包含了一个名为currentPost的状态,用于存储从Firestore获取的数据。在useEffect函数中,我们使用async/await语法来获取文档数据,并将获取到的数据存储在currentPost状态中。在渲染时,我们使用new Date()将时间戳转换为日期格式,并使用toLocaleDateString方法将其格式化为指定的日期字符串。
通过上述解决方法,我们可以在React中正确呈现Firestore时间戳。