Redux Firestore onSnapshot - PullRequest
       4

Redux Firestore onSnapshot

0 голосов
/ 22 октября 2018

Итак, я в настоящее время следую учебному пособию, где автор использует Redux для обновления данных в реальном времени с помощью базы данных в реальном времени.Внутри файла с избыточностью он использует метод .on, например так:

const watchPersonData = () => {
  return function(dispatch) {
    firebase.database().ref("person").on("value", function(snapshot) {

        var personData = snapshot.val();
        var actionSetPersonData = setPersonData(personData);
        dispatch(actionSetPersonData);

    }, function(error) { console.log(error); });
  }
};

Однако я хочу использовать облачное хранилище, поэтому я попытался преобразовать этот код с помощью метода onSnapshot.Тем не менее, пользователь не определен:

const watchPersonData = () => {
  return function(dispatch){



    db.collection('user').doc().onSnapshot(function(snap){



    var personData = snap.val();
    var actionSetPersonData = setPersonData(personData);
    dispatch(actionSetPersonData);

  })

  }
};

В настоящее время у меня есть коллекция с именем 'user', и в этой коллекции есть документ с автоматически сгенерированным идентификатором (поэтому doc () пуст) и внутри этого документа aСтрока называется имя пользователя.Любые идеи, почему this.props.personData.username не определен в консоли?

Весь файл app-redux:

import { createStore, applyMiddleware } from 'redux';
import thunkMiddleware from 'redux-thunk';
import * as firebase from 'firebase';


const db = firebase.firestore;


var config = {
    //config data for firebase
  };

firebase.initializeApp(config);


const initialState = {
  personData: { },
}

const reducer = (state = initialState, action) => {

  switch(action.type){
    case 'setPersonData':
      return { ...state, personData: action.value};

    default:
      return state;

  }
}
const store = createStore(reducer, applyMiddleware(thunkMiddleware));




const setPersonData = (personData) => {

  return{
    type: "setPersonData",
    value: personData
  };
};

const watchPersonData = () => {
  return function(dispatch){
    console.log('called')


    db.collection('user').doc().onSnapshot(function(snap){


    console.log(snap)
    var personData = snap;
    var actionSetPersonData = setPersonData(personData);
    dispatch(actionSetPersonData);




  })

  }
};








export { setPersonData, watchPersonData};
export { store };

Спасибо всем!заблаговременно!

1 Ответ

0 голосов
/ 03 декабря 2018

Вы пытаетесь получить доступ к определенному пользовательскому документу в коллекции пользователей?Вы не указываете идентификатор документа, который, я уверен, ведет к вашему неопределенному пользователю.

Вы можете вызывать onSnapshot непосредственно в коллекции и получать обновления коллекции (скажем, добавлен другой документ) или вызывать его для конкретного документа, как вы делаете, и обновляться при изменении этого документа.Простой способ проверить это жестко связать Id из вашей коллекции с помощью аргумента doc, подписаться на изменения документа и записать в консоль что-то вроде ('doc change'), а затем внести изменения вручную в консоль firestorm.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...