无法调用 reactReduxFirebase() - TypeError: Object is not a function

时间:2021-03-08 20:12:57

标签: redux react-redux redux-thunk react-redux-firebase redux-firestore

我使用 redux-thunk 作为中间件并尝试连接到 redux-firestore。当我运行应用程序时,我在 createStore 处收到错误 “TypeError: Object(...) is not a function”

import reportWebVitals from './reportWebVitals';
import {createStore,applyMiddleware,compose} from 'redux';
import rootReducer from './store/reducers/rootReducer';
import {Provider} from 'react-redux';
import thunk from 'redux-thunk'
import {reduxFirestore, getFirestore} from 'redux-firestore'
import {reactReduxFirebase, getFirebase} from 'react-redux-firebase'
import FBConfig from './Config/FBConfig'

const store = createStore(rootReducer,
  compose(applyMiddleware(thunk.withExtraArgument({getFirestore,getFirebase})),
    reduxFirestore(FBConfig),
    reactReduxFirebase(FBConfig)
  )
);

我在像这样的 thunk 操作中使用了额外的参数:

export const createProject=(project)=>{
      return(dispatch,getState,{getFirebase,getFirestore})=>{
            //asyn call to database
            const firestore=getFirestore();
            firestore.collection('projects').add({
                  ...project,
                  authorFirstName:'Nam',
                  authorLastName:'Pam',
                  authorId:123,
                  createAt: new Date()
            }).then(()=>{
                  dispatch({type:'CREATE_PROJECT',project});
                  
            }).catch((err)=>{
                  dispatch({type:'CREATE_PROJECT_ERROR',err})
            })  
      }
};

1 个答案:

答案 0 :(得分:1)

您看到的错误可能是由于升级 react-redux-firebase from v2 to v3(或基于过时示例的新代码)。此更新引入了一些重大更改,例如删除了 reactReduxFirebase 存储增强器功能。该包现在使用 React 上下文并引入了一些新的钩子,例如 useFirebaseuseFirestore,它们允许您通过函数组件中的上下文访问 firebase。但这对你的 thunk 没有帮助。

Redux Thunk Integration 的页面中,他们建议将 getFirebase 函数传递给 withExtraArgument

thunk.withExtraArgument(getFirebase)

就访问 firestore 而言,this GitHub discussion 建议通过 getFirebase 函数访问它。

getFirebase().firestore()

您希望额外的参数是一个具有 getFirebasegetFirestore 属性的对象。我们使用 getFirebase 作为一个属性并为 getFirestore 属性创建一个内联箭头函数。

import {createStore,applyMiddleware, AnyAction} from 'redux';
import thunk from 'redux-thunk';
import {getFirebase} from 'react-redux-firebase';

const store = createStore(
  rootReducer,
  applyMiddleware(
    thunk.withExtraArgument({
      getFirebase,
      getFirestore: () => getFirebase().firestore(),
    })
  )
);