Redux Firestore onSnapshot

时间:2018-10-22 14:14:48

标签: reactjs firebase redux google-cloud-firestore

因此,我目前正在关注一个教程,作者正在其中使用redux在实时数据库的帮助下实时更新数据。在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); });
  }
};

但是,我想使用Cloud Firestore,因此我尝试使用onSnapshot方法转换此代码。但是,用户是未定义的:

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



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



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

  })

  }
};

当前,我有一个名为“用户”的集合,并且在该集合中有一个具有自动生成的ID的文档(这就是doc()为空的原因),在该文档中有一个名为username的字符串。有什么想法为什么在控制台中未定义this.props.personData.username?

整个应用程序的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 :(得分:0)

您是否要访问用户集中的特定用户文档?您没有指定一个文件ID,我可以肯定它会导致您的未定义用户。

您可以直接在集合上调用onSnapshot并接收集合更新(例如添加了另一个文档),也可以像在进行操作一样在特定文档上调用它,并在该文档更改时进行更新。一种简单的测试方法是,通过doc参数将集合中的ID固定化,然后订阅doc更改并登录到控制台(例如“ doc changes”),然后在firestorm控制台中进行手动更改。