javascript - React 在更新实时数据库时运行无限循环

标签 javascript reactjs firebase-realtime-database

import React, { useState } from 'react';
import { ref, onValue, update} from "firebase/database";
import { database } from '../../utils/firebase';
import './Card.css';



function Card(props) {
    const [uid, setUID] = useState(props.uid);
    function completeCard() {
        const userRef = ref(database, 'users/' + uid);
          onValue(userRef, (snapshot) => {
            const data = snapshot.val();
            var completedMissions = data["challenges"];
            completedMissions.push(props.cardID);
            
            const updates = {};
            updates['/user/' + uid +'/challenges'] = completedMissions;
            //This is the line causing the infinite loop
            update(ref(database), updates);
            
          });
          
    }
    return(
        <div className="card">
            <h1>{props.name}</h1>
            <p>{props.description}</p>
            <button onClick={completeCard}>Complete</button>
            <button>+Info</button>
        </div>
    )
}
export default Card;

嗨,当我尝试更新 firebase 实时数据库中的值时,它导致无限循环!我认为 onValue 可能会导致问题,但我不知道如何解决它。我希望按下按钮时只更新一次值,因为它只应该更改一次,提前谢谢您!

最佳答案

onValue 设置一个监听器,每次数据库的该部分发生更改时,该监听器都会重复回调您。因此它第一次获取数据并运行您的代码。您的代码更新了数据库,因此回调再次发生,这导致您再次更新数据库。重复。

如果您只想获取一次值,请使用 get 代替:

import { ref, get, update } from "firebase/database";

//...
function completeCard() {
  const userRef = ref(database, "users/" + uid);
  get(userRef).then((snapshot) => {
    const data = snapshot.val();
    const completedMissions = data["challenges"];
    completedMissions.push(props.cardID);

    const updates = {};
    updates["/user/" + uid + "/challenges"] = completedMissions;
    update(ref(database), updates);
  });
}

或者使用异步/等待:

async function completeCard() {
  const userRef = ref(database, "users/" + uid);
  const snapshot = await get(userRef);
  const data = snapshot.val();
  const completedMissions = data["challenges"];
  completedMissions.push(props.cardID);

  const updates = {};
  updates["/user/" + uid + "/challenges"] = completedMissions;
  update(ref(database), updates);
}

关于javascript - React 在更新实时数据库时运行无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69078395/

相关文章:

reactjs - 如何在React组件渲染中使用font-face字体系列?

javascript - 在 React.js 中通过索引访问对象数组

javascript - React 中的对象

android - 来自 Firebase 的数据 - android 回收器 View 重新填充

javascript - Apigee 路由帖子获取 api

javascript - 如何为表行结果的每个按钮添加事件监听器?

javascript - 如何通过单击ReactJS网页上的按钮通过USB发送一些位?

javascript - Durandal 函数未定义

javascript - Firebase 函数算法 onWrite

ios - 在 firebase 问题中手动输入数据