База данных Firebase Realtime в приложении React: как получить доступ к значениям? - PullRequest
0 голосов
/ 31 марта 2020

Я разрабатываю приложение с одним модератором, который пишет в базу данных по клику, а гости только читают данные. Вы модератор, если user === id - true. Я хочу назвать события кликов для гостей, которые выполняет модератор, чтобы они тоже видели результаты. Но когда я пытаюсь получить доступ к значениям, они говорят, что это ноль. Единственный способ - щелкнуть в приложении в качестве гостя то, что я не хочу, потому что гости должны обновляться, ничего не делая. Я немного смущен. Поэтому заранее извините, если мое описание не очень понятно. Будем рады получить помощь.

useEffect(() => {
    if(user && id){
        if(user===id){
            dbTimer.set(
                {lastUpdated: Math.floor(Date.now() / 1000), isRunning});
        }
        else{
            dbTimer.child("IsRunning").on("value", snap=>setIsRunning(snap.val()));
            console.log("isRunning", isRunning) // null
            if(isRunning){
                mouseIsUpHandler();
            }
        }
    }
}, [user, id, isRunning, isDown]);

1 Ответ

1 голос
/ 31 марта 2020

Вы в основном на правильном пути. Я предполагаю, что setIsRunning является useState функцией обновления. Вызов этого и немедленная проверка значения не будут работать, потому что переменная isRunning имеет исходное значение до вызова функции обновления. Проверяя значение внутри функции обратного вызова, вы сможете достичь желаемого результата.

useEffect(() => {
  if(user && id){
    if(user===id){
      dbTimer.set(
        {lastUpdated: Math.floor(Date.now() / 1000), isRunning});
    } else {
      dbTimer.child("IsRunning").on("value", 
        snap => {
          const newIsRunning = snap.val();
          setIsRunning(newIsRunning);
          console.log("isRunning", newIsRunning);
          if(newIsRunning){
            mouseIsUpHandler();
          }
        });
    }
  }
}, [user, id, isRunning, isDown]);
...