score:87
You have to dispatch after the async request ends.
This would work:
export function bindComments(postId) {
return function(dispatch) {
return API.fetchComments(postId).then(comments => {
// dispatch
dispatch({
type: BIND_COMMENTS,
comments,
postId
});
});
};
}
score:0
Action Definition
const selectSlice = () => {
return {
type: 'SELECT_SLICE'
}
};
Action Dispatch
store.dispatch({
type:'SELECT_SLICE'
});
Make sure the object structure of action defined is same as action dispatched. In my case, while dispatching action, type was not assigned to property type
.
score:0
If you are working with redux-observable check that your action returns an observable. I had the issue because I used map and not a mergemap
// error
export const myEpic = (action$: any) =>
action$.pipe(
ofType('...'),
map((x => x.payload),
map((x) => callAPi(x)),
)
// success
export const myEpic = (action$: any) =>
action$.pipe(
ofType('...'),
map((x => x.payload),
mergeMap((x) => callAPi(x)),
)
score:0
Just here to share my case.
I had a setLoading
action, while also having
const [loading, setLoading] = useState(false)
above which I didn't delete. So it was basically not dispatching the setLoading
from redux but the one from useState. Deleting/renaming this solves the problem.
score:0
if things were working with this code and this is a new iteration, check to make sure you have your variables in the correct order for the function (this was my mistake)
i.e. code that got this error
export const fetchProjects = newPage => (getState, dispatch) => NOPE
export const fetchProjects = newPage => (dispatch, getState) => OK YEAH
score:0
In my case, I just wanted to sent some values to the server without saving them to redux store, so I was not using a type, nor dispatching anything at the end. But I was calling the action with dispatch. So all I had to do, was to remove the dispatch, because it wasn't really an action. It was just a function.
score:0
For me, the solution was to add redux-thunk
as a middleware, so inside my store configuration file, I passed redux-thunk as middleware.
inside the console:
import reducerData from './store-reducer';
import {applyMiddleware, compose, createStore} from 'redux';
import ReduxThunk from 'redux-thunk';
const middlewares = [ReduxThunk];
const store = createStore(
reducerData,
compose(applyMiddleware(...middlewares)),
);
export default store;
score:0
Arrow function syntax
export const bindComments = (postId) => dispatch => {
return API.fetchComments(postId).then(comments => {
// dispatch
dispatch({
type: BIND_COMMENTS,
comments,
postId
})
})}
score:0
This error occurs mainly if you are dispatching an action and your action is not returning an object. For example here is an increment function which I use it to increment number value when increment button is clicked.
const increment = () => type: INCREMENT
and here is my dispatch function onClick={() => dispatch(increment)}
because of ommiting parenthesis
()
inside dispatch function now in your terminal there would be the same error appears. The reason dispatch function expects an object not a function name...
score:0
This error occurs when you make an asynchronous api call in your action creator you need to convert your action creator from synchornous action creator to asynchronous action and this conversion can be possible if we use the middleware so let me explain you in detailRedux without middleware
Two types of action creators Sync Action Creator VS Async Action Creator. you need to change sync action to async action in order to get rid of this error and this can be done with middleware
Redux with middleware enter image description here
So now solution is: Dispatch after the async request would befinished.
export function bindComments(postId) {
return function(dispatch) {
return API.fetchComments(postId).then(comments => {
// dispatch
dispatch({
type: BIND_COMMENTS,
comments,
postId
});
});
};
}
score:0
Without middleware, redux supports only synchronous data flow. If you need to make ajax request and dispatch the result of this request, then you need to use middlewares that handles the async operations like, redux-promise
, redux-thunk
or redux-saga
. Or you could write your own middleware:
export default ({ dispatch }) =>
(next) =>
(action) => {
// check if there is payload in action. if not send it to the next middleware
if (!action.payload || !action.payload.then) {
return next.action;
}
// if we are here means we have action.payload. now check if it is promise
// wait for the promise to be resolved
action.payload.then(function (response) {
// overwrite the action
const newAction = { ...action, payload: response };
dispatch(newAction);
});
};
score:0
I have solved my issue changing :
export const = async (dispatch) => {}
to,
export const = () => async (dispatch) => {}
score:1
Use redux-thunk, setup with redux & create action like this
export const actionName = (data) => dispatch => {
dispatch({
type:"ACTION_TYPE"
payload:"my payload"
})
}
score:1
You might also have forgotten to getDefaultMiddleware() in the middlewares' array, as I did. No further installations required:
export const store = configureStore({
reducer: GlobalReducer,
middleware: (getDefaultMiddleware) => [
...getDefaultMiddleware(),
mainMiddleware,
],
});
score:2
I had same issue as I had missed adding composeEnhancers. Once this is setup then you can take a look into action creators. You get this error when this is not setup as well.
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(
rootReducer,
composeEnhancers(applyMiddleware(thunk))
);
score:7
Make use of Arrow functions it improves the readability of code.
No need to return anything in API.fetchComments
, Api call is asynchronous when the request is completed then
will get the response, there you have to just dispatch
type and data.
Below code does the same job by making use of Arrow functions.
export const bindComments = postId => {
return dispatch => {
API.fetchComments(postId).then(comments => {
dispatch({
type: BIND_COMMENTS,
comments,
postId
});
});
};
};
score:7
Change:
export const <youractionName> = async (dispatch) => {}
to,
export const <youractionName> = () => async (dispatch) => {}
This fixed my issue. Missed a '() =>'
score:14
You can't use fetch in actions without middleware. Actions must be plain objects. You can use a middleware like redux-thunk or redux-saga to do fetch and then dispatch another action.
Here is an example of async action using redux-thunk middleware.
export function checkUserLoggedIn (authCode) {
let url = `${loginUrl}validate?auth_code=${authCode}`;
return dispatch => {
return fetch(url,{
method: 'GET',
headers: {
"Content-Type": "application/json"
}
}
)
.then((resp) => {
let json = resp.json();
if (resp.status >= 200 && resp.status < 300) {
return json;
} else {
return json.then(Promise.reject.bind(Promise));
}
})
.then(
json => {
if (json.result && (json.result.status === 'error')) {
dispatch(errorOccurred(json.result));
dispatch(logOut());
}
else{
dispatch(verified(json.result));
}
}
)
.catch((error) => {
dispatch(warningOccurred(error, url));
})
}
}
score:32
The error is simply asking you to insert a Middleware in between which would help to handle async operations.
You could do that by :
npm i redux-thunk
Inside index.js
import thunk from "redux-thunk"
import { createStore, applyMiddleware } from 'redux';
...createStore(rootReducers, applyMiddleware(thunk));
Now, async operations will work inside your functions.
score:48
For future seekers who might have dropped simple details like me, in my case I just have forgotten to call my action function with parentheses.
actions.js:
export function addNewComponent() {
return {
type: ADD_NEW_COMPONENT,
};
}
myComponent.js:
import React, { useEffect } from 'react';
import { addNewComponent } from '../../redux/actions';
useEffect(() => {
dispatch(refreshAllComponents); // <= Here was what I've missed.
}, []);
I've forgotten to dispatch the action function with ()
. So doing this solved my issue.
useEffect(() => {
dispatch(refreshAllComponents());
}, []);
Again this might have nothing to do with OP's problem, but I hope I helps people with the same problem as mine.
Source: stackoverflow.com
Related Query
- React Redux Saga: Actions must be plain objects. Use custom middleware for async actions
- react & redux with hooks: Actions must be plain objects. Use custom middleware for async actions
- React redux Actions must be plain objects. Use custom middleware for async actions
- Redux Actions must be plain objects. Use custom middleware for async actions
- Redux Error Actions must be plain objects. Use custom middleware for async actions
- Redux thunk - Error ยท Actions must be plain objects. Use custom middleware for async actions even with dispatch an object with key type
- Redux error: Actions must be plain objects. Use custom middleware for async actions
- Problem with redux middleware - Error: Actions must be plain objects. Use custom middleware for async actions
- Async Action Redux Unhandled Rejection (Error): Actions must be plain objects. Use custom middleware for async actions
- Use custom middleware for async actions. Actions must be plain objects
- React-Redux: Actions must be plain objects. Use custom middleware for async actions
- Unit test: Actions must be plain objects. Use custom middleware for async actions
- CreateAsyncThunk Error: Actions must be plain objects. Use custom middleware for async actions
- React-Redux-Saga: Actions must be plain objects. Use custom middleware for async actions
- React-Redux - Unhandled Rejection (Error): Actions must be plain objects. Use custom middleware for async actions
- React-Redux: Actions must be plain objects. Use custom middleware for async actions Error
- Actions must be plain objects. Use custom middleware for async actions.how to solve this
- react-redux Error: Actions must be plain objects. Use custom middleware for async actions
- redux-observable + socket.io: Actions must be plain objects. Use custom middleware for async actions
- Error: Actions must be plain objects. Use custom middleware for async actions.
- Actions must be plain objects. Use custom middleware for async actions - Lost Here
- Actions must be plain objects. Use custom middleware for async actions
- How to fix: Error: Actions must be plain objects. Use custom middleware for async actions.?
- Redux-Thunk Error: Actions must be plain objects. Use custom middleware for async actions
- Error: Actions must be plain objects. Use custom middleware for async actions. But I don`t have async functions
- Redux Thunk + Axios "Actions must be plain objects. Use custom middleware for async actions."
- React/Redux: Error: Actions must be plain objects. Use custom middleware for async actions
- React-Reudx: Actions must be plain objects. Use custom middleware for async actions
- redux-observable: Actions must be plain objects. Use custom middleware for async actions
- Actions must be plain objects. Use custom middleware for async actions Saga thunk I do have so far in my store
More Query from same tag
- Using slice function for breadcrumb routes
- Return an array of object in a ionic reactjs component
- Is there a way to decorate the text within the Link element of 'react-router-dom'?
- Show Sidebar Navigation only at Home using React Router Dom
- React microfrontend with Module Federation
- How can I set the parent component state based on children component checkbox value?
- How to use <Link> and <Button> in React
- Redux - Asynchronous response from web socket request
- How would I pass an alternating color to a component with the Array.map function?
- CSS positioning footer elements (wave image and content)
- How to mock data from service as hook with React Testing Library?
- How to render an element (React Class) an arbitrary number of times?
- Use state or refs in React.js form components?
- What is the best way to handle Firestore with React?
- How to define child routes as react components in react-router?
- How can I remove the magnifying glass button from an Ant Design input search box?
- How do I allow function #2 to run only after function #1 is complete, but without triggering function #2?
- How to change the text colour of a materialize input field within local home.scss file
- Accessing Data in Object over http put request
- React - Loop inputs and get sum value
- How can I change the label size of a material ui TextField?
- Can we combine css selectors and react selectors in TestCafe?
- Can using a middle layer as an API bypass CORS?
- Unique Key in React/Material Ui
- Typescript for Facebook React
- ReactJS remove item from state (array of objects)
- React: how to change page when using react-navigation and react-router?
- Distinguish between arguments and react events
- Calling const inside a function Reactjs
- How can I change customswitch label on/off in reactstrap?