firebase - 无限循环 - React Native useState useEffect
问题描述
我是钩子的新手,并且印象中useEffect
只在页面加载时运行了一次。我将兴趣状态变量设置为返回的 firebase 响应,但它遇到了无限循环。为什么会发生这种情况?据我了解,firebase.once
方法应该只拉回一次数据。
const ProfileCardScreen = ({navigation}) => {
const user = navigation.getParam('user');
const [interests, setInterests] = useState([]);
const getUserProfileData = () => {
var userId = user.uid;
firebase.database().ref('/Users/' + userId).once('value').then(function(snapshot) {
var interests = (snapshot.val() && snapshot.val().interests);
Object.keys(interests).map(function(key) {
setInterests(interests);
});
});
};
useEffect(() => {
getUserProfileData();
});
解决方案
是的,您可以使用 useEffect() 在页面加载后立即运行某些内容。但是,要实现这一点,您必须添加第二个参数,在本例中为一个空数组,以仅在挂载和卸载时运行(否则它也在更新时运行)。
意思是,它应该如下所示:
useEffect(() => {
getUserProfileData();
}, []);
旁注:通过在空数组中添加一个状态变量(如:[myState]),您将为该状态创建一个侦听器。在这种情况下,useEffect 将仅作为该状态的“didUpdate”函数工作。
推荐阅读
- c - C - 查找元素的频率失败,数字为 0
- javascript - 2 个具有最小和最大日期的依赖日期选择器
- c# - 从 EF 中的集合中删除项目 - 奇怪的问题
- r - 在 CentOS 的 fftwtools 上安装 R 包需要 fftw3
- android - 从 Webview 调用时,Admob 插页式广告不可点击
- yii2 - Yii2 GridView如何使用GET参数创建链接到数组ModelSearch
- c# - 如何使用 Application Insights Profiler 分析对 Azure 云服务的所有 Web 请求?
- bash - 如何以另一个用户身份从脚本运行函数
- node.js - 无法将环境变量传递给 docker
- r - 如何在不丢失行的情况下加入数据框