简体   繁体   中英

unable to use redux-devtools-extension with react-router-redux syncHistoryWithStore

I am unable to use redux-devtools-extension with react-router-redux's syncHistoryWithStore. The error i get is Uncaught TypeError: store.getState is not a function.

syncHistoryWithStore @ sync.js:38 (anonymous function) @ store.js:30

my store.js

import { createStore, applyMiddleware, compose } from 'redux';
import { syncHistoryWithStore } from 'react-router-redux';
import { browserHistory } from 'react-router';
import thunkMiddleware from 'redux-thunk';
import createLogger from 'redux-logger';
import rootReducer from './reducers/reducers';
import devTools from 'remote-redux-devtools';

const loggerMiddleware = createLogger()

import data from './dummydata/data'

// dummy data is an export of an array of objects
// 
// {
//  const data = [
//     {
//        "Id":"BAcyDyQwcXX",
//        "labels": ['P1', 'P2', 'P3', 'P4', 'P5/P6'],
//        "series": [[1, 2, 3, 4, 5]],
//        "total": 0
//     }
// ]
// }

const initialState = {
  data
};

//const store = createStore(rootReducer, initialState)
//it works when i use this, but when try to implement the devTools extension, 
//the error fires.

const store = function configureStore(initialState) {
  const storeCreator = createStore(rootReducer, initialState,
    window.devToolsExtension && window.devToolsExtension()
  );
  return storeCreator;
}

export const history = syncHistoryWithStore(browserHistory, store)

export default store;

my rootReducer.js

import { combineReducers } from 'redux'
import { routerReducer } from 'react-router-redux';

function post(state = [], action) {
  console.log("state: ", state, "action: ", action);
  return state
}

const rootReducer = combineReducers({
  post, routing: routerReducer
})

export default rootReducer

my main.js

import React from 'react';
import { render } from 'react-dom';
import { Provider } from 'react-redux';

import css from  './styles/stylesheets/style.css';

import store, { history } from './store';

import Main from './components/Main';
import Index from './components/Index';
import Single from './components/Single';
import GraphChart from './components/GraphChart';

import { Router, Route, IndexRoute } from 'react-router';

const router = (
  <Provider store={store}>
    <Router history={history}>
      <Route path="/" component={Main}>
        <IndexRoute component={GraphChart}></IndexRoute>
        <Route path="/view" component={Single}></Route>
      </Route>
    </Router>
  </Provider>
)

render(router, document.querySelector('#react-container'));

I think the problem here is that your store is a function that creates the actual store when you call it and is not the instance of a store.

Try something like this. Export configureStore as a function in myStore.js

import { createStore, applyMiddleware, compose } from 'redux';
import thunkMiddleware from 'redux-thunk';
import createLogger from 'redux-logger';
import rootReducer from './reducers/reducers';
import devTools from 'remote-redux-devtools';

const loggerMiddleware = createLogger()

export default function configureStore(initialState) {
   const storeCreator = createStore(rootReducer, initialState,
      window.devToolsExtension && window.devToolsExtension()
   );
   return storeCreator;
}

and in your main.js import the configureStore and create the store with the initial data from here. Once you get the instance of the store you can synchHistoryWithStore here.

import React from 'react';
import { render } from 'react-dom';
import { Provider } from 'react-redux';
import data from './dummydata/data'
import css from  './styles/stylesheets/style.css';

import createStore from './store';
import { browserHistory } from 'react-router';
import { syncHistoryWithStore } from 'react-router-redux';
import Main from './components/Main';
import Index from './components/Index';
import Single from './components/Single';
import GraphChart from './components/GraphChart';

import { Router, Route, IndexRoute } from 'react-router';
const initialState = {
  data
};
const store = createStore(initialData)
const history = syncHistoryWithStore(browserHistory, store);

const router = (
  <Provider store={store}>
    <Router history={history}>
      <Route path="/" component={Main}>
        <IndexRoute component={GraphChart}></IndexRoute>
        <Route path="/view" component={Single}></Route>
      </Route>
    </Router>
  </Provider>
)

render(router, document.querySelector('#react-container'));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM