reactjs - React 中的 setState 不会更新
问题描述
我需要通过来自 firebase 的 querySnapshot 从 S3 获取数据,它给了我密钥然后显示视频,我使用 setVideos 更新包含 RetrivedVideo 的视频数组,这是一个需要 id 和 url 的类,我的问题是当我打电话时setVideos 它没有向我显示视频,你能帮我吗?
import React, { useState, useEffect } from "react";
import Video from "./Video";
import "./Home.css";
import RetrivedVideo from "./RetrivedVideo.js";
import { collection, getDocs } from "firebase/firestore";
import { getFirestore } from "firebase/firestore";
import firebaseApp from "./firebase.js";
import { Storage } from "aws-amplify";
export default function Home() {
const [videos, setVideos] = useState([]);
useEffect(() => {
let data = [];
const db = getFirestore();
async function fetchData() {
const querySnapshot = await getDocs(collection(db, "videos"));
querySnapshot.forEach(async (doc) => {
await Storage.get(doc.id).then((signedURL) => {
const retrivedVideo = new RetrivedVideo(doc.id, signedURL);
data.push(retrivedVideo);
});
});
setVideos([...videos, ...data]);
console.log(videos);
}
fetchData();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return (
<div className="app">
<div className="container-videos">
{videos.map((v) => (
<Video
className="video"
key={v.id}
url={v.url}
/>
))}
</div>
</div>
);
}
解决方案
您正在加载数据之前设置状态。另一个错误是你使用了错误的扩展运算符,它应该在一个数组中[...myArr, ...mySecArr]
尝试setVideos
在 fetchData 函数中移动
useEffect(() => {
let data = [];
const db = getFirestore();
async function fetchData() {
const querySnapshot = await getDocs(collection(db, "videos"));
querySnapshot.forEach(async (doc) => {
const signedUrl = await Storage.get(doc.id);
const retrivedVideo = new RetrivedVideo(doc.id, signedURL);
data.push(retrivedVideo);
});
setVideos([...videos, ...data]);
}
fetchData();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
推荐阅读
- .net-core - VSTS dotnet 恢复公司(或自签名)证书问题
- java - infinispan 10.1 没有为 Java 类型 java.util.ArrayList 注册编组器
- apache-spark - 从 BigQuery 读取字符串 NULL 值时出现问题
- python - 如何在 pos odoo13 中覆盖 models.js 中的模型
- ios - 如何使用循环从 Firebase 实时数据库中读取数据
- google-chrome-devtools - 如何抑制 Chrome DevTools 警告:“DevTools 无法加载 SourceMap:无法为...加载内容”
- xamarin - Xamarin.Forms:远离母版页的导航丢失箭头
- reactjs - Semantic UI React:如何使 Tab 菜单使用容器的全宽?
- r - 从多边形R中的边缘创建从质心到20 m的缓冲区
- ruby - 为什么 ruby 不能使用大多数 2^X 数字作为对象 ID?