问题
I'm trying to apply redux in my reactjs app. I can't proceed because of these errors:
I'm sure that I already installed all the dependencies that I need. Here is a relevant part of my package.json
"dependencies": {
"react-redux": "^5.0.6",
"redux": "^3.7.2",
"redux-logger": "^3.0.6",
"redux-promise": "^0.5.3",
"redux-thunk": "^2.2.0",
}
Here is a part of my index.js that implements redux
import { createStore, applyMiddleware } from 'redux';
import { Provider } from 'react-redux';
import thunkMiddleware from 'redux-thunk';
import createLogger from 'redux-logger';
import reducers from './reducers';
const logger = createLogger();
const store = createStore(reducers,
applyMiddleware(
thunkMiddleware, logger
)
)
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
回答1:
According to the docs you are mixing up the usage of redux-logger
You either need to import the specific createLogger
function
import { createLogger } from 'redux-logger'
const logger = createLogger({
// ...options
});
Or use the default import
import logger from 'redux-logger'
And then your code should be fine
const store = createStore(
reducers,
applyMiddleware(thunkMiddleware, logger)
)
回答2:
I don't see react and react-dom in your dependencies, and it is not included in the import statements.
Let me provide you with an example of how I did an App recently, also using the redux developer tools which is amazing.
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { createStore, combineReducers, applyMiddleware, compose } from 'redux';
import reduxThunk from 'redux-thunk';
import App from './components/App';
import authReducer from '../reducers/auth';
import urlsReducer from '../reducers/urls';
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
//Store creation
const store = createStore(
combineReducers({
auth: authReducer,
urls: urlsReducer
}),
composeEnhancers(applyMiddleware(reduxThunk))
);
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
I would figure that you just need to add logger, after reduxThunk. And if you have already combined your reducers, then just provide reducers instead of combineReducers.
Regards, Rafael
回答3:
the easiest way to fix the issue
import * as thunk from 'redux-thunk';
createStore(rootReducer, InitialState, applyMiddleware(thunk.default));
回答4:
I was getting the same error TypeError: middleware is not a function.
import { createStore, combineReducers, applyMiddleware } from "redux";
import { createLogger } from "redux-logger";
import thunk from "redux-thunk";
import math from "./reducers/mathReducer";
import user from "./reducers/userReducer";
const logger = createLogger();
export default createStore(
combineReducers({ math, user }),
{},
applyMiddleware(logger, thunk)
);
Replacing applyMiddleware(logger, thunk)
with applyMiddleware(logger, thunk.default)
worked for me.
回答5:
I was trying to add logger
to the list of middleware only in development but messed up the import and received the same error. To fix my issue, I needed to add .default
to the require()
:
const middleware = []
if (process.env.NODE_ENV === 'development') {
middleware.push(require('redux-logger').default)
}
来源:https://stackoverflow.com/questions/46869671/typeerror-middleware-is-not-a-function