javascript - 如何使用 useState 和 React-redux-firebase 重新渲染
问题描述
我正在探索 react-redux-firebase 的钩子,但我的“setDataProducts”表现得很奇怪。我使用 useEffect() 就像我可以使用 componentDidMount() 但不确定这是否是正确的方法。
export default function ProductList() {
const [dataProducts, setDataProducts] = useState([]);
const firestore = useFirestore();
const fetchProducts = async () => {
const response = firestore.collection("products");
const data = await response.get();
data.docs.forEach((product) => {
setDataProducts([...dataProducts, product.data()]);
console.log(product.data());
});
};
useEffect(() => {
fetchProducts();
}, []);
return (
<div>
{isLoaded &&
dataProducts.map((product) => {
return (
<div>
<h4>{product.title}</h4>
<h3>{product.price}</h3>
</div>
);
})}
</div>
);
}
我无法渲染我在 Firestore 中拥有的两种产品。只有一个正在渲染......所以我不明白。状态更新时不应该重新渲染吗?
谢谢您的回复
解决方案
我认为这是因为您在 dataProducts 更新之前再次调用了 setDataProducts。
请用以下代码替换 fetchProducts 方法:
const fetchProducts = async () => {
const response = firestore.collection("products");
const data = await response.get();
const newProducts = data.docs.map((product) => product.data());
console.log(newProducts);
setDataProducts([...dataProducts, ...newProducts]);
};
推荐阅读
- javascript - 在网络应用程序中,拨打电话,然后在通话结束后返回窗口
- javascript - 使用 github 的 graphql api 获取拉取请求的批准数
- java - 根据自定义时间单位计算天数
- python - Scrapy链接队列
- excel - 如何仅使用 ROW() 函数和增量值来增加行数?
- typescript - 如何获取 VS Code 调试数据,如断点、步骤、行代码
- visual-studio - FFTW Visual Studio fortran(intel)链接时未解析的符号
- python - Python 使用本地文件而不是 url 参数
- ios - iOS Packet Tunnel 源与目标模式和表单
- powershell - 用于插入 SQL 数据库的 CSV 数据的字符串操作和输出格式