未捕获的TypeError:store.getState不是函数

Jas*_* O. 6 reactjs redux

在我的redux js app(google appengine后端)中,当打开包含Root组件的页面时,我收到以下警告和错误消息.

警告:propType失败:提供store的类型的无效prop ,预期.检查渲染方法.bundle.js:6169functionProviderobjectRoot

警告:propType失败:提供store的类型的无效prop ,预期.检查渲染方法.bundle.js:6169functionDevToolsWrapperobjectRoot

警告:失败的上下文类型:提供store的类型的子上下文无效,是预期的.检查渲染方法.bundle.js:6169functionProviderobjectRoot

警告:无法上下文类型:无效的上下文store类型的function供给Connect(AsyncApp),预计object.检查渲染方法Provider.

Uncaught TypeError: store.getState is not a function
Run Code Online (Sandbox Code Playgroud)

这是react-redux的lib/components/createConnect.js中发生错误的地方.

    function computeStateProps(store, props) {
      var state = store.getState();  <<<<< The error occurs here.
      var stateProps = shouldUpdateStateProps ? finalMapStateToProps(state, props) : finalMapStateToProps(state);

      _invariant2['default'](_utilsIsPlainObject2['default'](stateProps), '`mapStateToProps` must return an object. Instead received %s.', stateProps);
      return stateProps;
    }
Run Code Online (Sandbox Code Playgroud)

在断点处,在此错误发生之前,console.log(store)将返回此错误.

function (reducer, initialState) {
      var store = next(reducer, initialState);
      var _dispatch = store.dispatch;
      var chain = [];

      var middlewareAPI = {
        getState: store.…
Run Code Online (Sandbox Code Playgroud)

但是,当我使用Node后端运行完全相同的代码时,console.log(store)会返回此对象.

devToolsStore: Object
dispatch: (action)
getReducer: getReducer()
getState: getState()
replaceReducer: replaceReducer(nextReducer)
subscribe: subscribe(listener)
Run Code Online (Sandbox Code Playgroud)

我的root组件和configureStore.js如下所示:

import React, { Component } from 'react';
import { Provider } from 'react-redux';
import configureStore from '../store/configureStore';

import { createStore, applyMiddleware, combineReducers, compose } from 'redux';
import { DevTools, DebugPanel, LogMonitor } from 'redux-devtools/lib/react';


import AsyncApp from './AsyncApp';

const store = configureStore();

export default class Root extends Component {
  render() {
return (
 <div>
  <Provider store={store}>
    {() => <AsyncApp />}
  </Provider>
  <DebugPanel top right bottom>
    <DevTools store={store} monitor={LogMonitor} />
  </DebugPanel>
</div>
);
}
}
Run Code Online (Sandbox Code Playgroud)

configureStore.js

import { createStore, applyMiddleware, combineReducers, compose } from "redux";
import thunkMiddleware from "redux-thunk";
import loggerMiddleware from "redux-logger";
import rootReducer from "../reducers";
import thunk from 'redux-thunk';
import { devTools, persistState } from 'redux-devtools';

const finalCreateStore = compose(
    applyMiddleware(thunkMiddleware),
    devTools(),
    persistState(window.location.href.match(/[?&]debug_session=([^&]+)\b/)),
    createStore
);

export default function configureStore(initialState) {
  return finalCreateStore(rootReducer, initialState);
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*mov 9

我的猜测是你正在运行一个旧的示例代码.Redux 2.0 compose()函数API 发生重大变化.

代替

const finalCreateStore = compose(
    applyMiddleware(thunkMiddleware),
    devTools(),
    persistState(window.location.href.match(/[?&]debug_session=([^&]+)\b/)),
    createStore
);
Run Code Online (Sandbox Code Playgroud)

你可能想要的

const finalCreateStore = compose(
    applyMiddleware(thunkMiddleware),
    devTools(),
    persistState(window.location.href.match(/[?&]debug_session=([^&]+)\b/))
)(createStore);
Run Code Online (Sandbox Code Playgroud)