Firebase firestore 读取操作非常高
Firebase firestore read operation very high
所以基本上我正在为后端使用 React 和 firebase firestore 制作一个 CRUD 应用程序。
我的写入和删除操作都很好,没有问题。
但是我的读取操作有问题
我的网站正在使用 useEffect 从 firebase 中的集合中获取所有文档。所以这只有 运行 每当它第一次挂载时(当我的网络第一次加载时)以及当我在执行删除和创建操作时更改“用户”值时
这是我的代码:
useEffect(() => {
const getUsers = async () => {
const querySnapshot = await getDocs(collection(db, "cobadata"));
setUsers(querySnapshot.docs.map((doc)=> ({...doc.data(), id: doc.id})))
};
getUsers();
}, [users]);
idk 怎么了,但是当我测试网络时,我得到了一个非常高的读取操作,就像我在我的网站上做的每一个读取操作一样,它在 firebase 中得到了一百个操作。我可以在我的 firebase 控制台中看到这一点,当我在我的 firebase 控制台中使用网络时就像 5 分钟一样,读取操作达到 20k< 操作。
谁能帮我解决这个问题,谢谢!
你没有在这里展示你所有的代码,所以我需要做一些猜测。
您的 useEffect
有一个依赖项数组,现在设置为 [users]
。这意味着每次变量 users
更改时,您的 useEffect 都会重新渲染。然后在 useEffect
中通过 setUsers
函数将新值设置为 users
。即使您从 firebase 获得与当前用户相同的返回值,您仍然会在每次读取数据时创建一个新数组。 (querySnapshot.docs.map((doc)=> ({...doc.data(), id: doc.id}))
)。 React 仅进行浅比较,这意味着对象引用已更改,因此 users
在每次渲染时都不同。
首先,您需要决定何时 运行 useEffect 以及什么应该触发它。如果变量 users
中的更改不是要检查的正确位置,那么我将从依赖项数组中删除 users
。
一种解决方案是将效果中的功能移动到它自己的函数中,并将其包装在 useCallbac
中。然后,您可以在初始加载时从“useEffect”调用此函数,然后在删除或创建用户时只需加载效果即可。像这样。
const getUsers = useCallback(async () => {
const querySnapshot = await getDocs(collection(db, "cobadata"));
setUsers(querySnapshot.docs.map((doc)=> ({...doc.data(), id: doc.id})))
}, [collection])
useEffect(() => {
getUsers()
}, [getUsers]);
const createUser = () => {
...
getUsers()
}
const deleteUser = () => {
...
getUsers()
}
(PS!我建议将 eslint-plugin-react-hooks 添加到你的 eslint-config 中。如果你的钩子使用错误,这会给你一些警告)
所以基本上我正在为后端使用 React 和 firebase firestore 制作一个 CRUD 应用程序。 我的写入和删除操作都很好,没有问题。
但是我的读取操作有问题
我的网站正在使用 useEffect 从 firebase 中的集合中获取所有文档。所以这只有 运行 每当它第一次挂载时(当我的网络第一次加载时)以及当我在执行删除和创建操作时更改“用户”值时
这是我的代码:
useEffect(() => {
const getUsers = async () => {
const querySnapshot = await getDocs(collection(db, "cobadata"));
setUsers(querySnapshot.docs.map((doc)=> ({...doc.data(), id: doc.id})))
};
getUsers();
}, [users]);
idk 怎么了,但是当我测试网络时,我得到了一个非常高的读取操作,就像我在我的网站上做的每一个读取操作一样,它在 firebase 中得到了一百个操作。我可以在我的 firebase 控制台中看到这一点,当我在我的 firebase 控制台中使用网络时就像 5 分钟一样,读取操作达到 20k< 操作。
谁能帮我解决这个问题,谢谢!
你没有在这里展示你所有的代码,所以我需要做一些猜测。
您的 useEffect
有一个依赖项数组,现在设置为 [users]
。这意味着每次变量 users
更改时,您的 useEffect 都会重新渲染。然后在 useEffect
中通过 setUsers
函数将新值设置为 users
。即使您从 firebase 获得与当前用户相同的返回值,您仍然会在每次读取数据时创建一个新数组。 (querySnapshot.docs.map((doc)=> ({...doc.data(), id: doc.id}))
)。 React 仅进行浅比较,这意味着对象引用已更改,因此 users
在每次渲染时都不同。
首先,您需要决定何时 运行 useEffect 以及什么应该触发它。如果变量 users
中的更改不是要检查的正确位置,那么我将从依赖项数组中删除 users
。
一种解决方案是将效果中的功能移动到它自己的函数中,并将其包装在 useCallbac
中。然后,您可以在初始加载时从“useEffect”调用此函数,然后在删除或创建用户时只需加载效果即可。像这样。
const getUsers = useCallback(async () => {
const querySnapshot = await getDocs(collection(db, "cobadata"));
setUsers(querySnapshot.docs.map((doc)=> ({...doc.data(), id: doc.id})))
}, [collection])
useEffect(() => {
getUsers()
}, [getUsers]);
const createUser = () => {
...
getUsers()
}
const deleteUser = () => {
...
getUsers()
}
(PS!我建议将 eslint-plugin-react-hooks 添加到你的 eslint-config 中。如果你的钩子使用错误,这会给你一些警告)