I'm having problems with misconfigured Redux after merging contents of multiple files into one to serve as config for Redux.
How to resolve store
, while keeping this in one file?
Unhandled JS Exception: Could not find "store" in either the context or props of "Connect(App)". Either wrap the root component in a , or explicitly pass "store" as a prop to "Connect(App)".
'use strict'; import React, { Component } from 'react'; import { createStore, applyMiddleware, combineReducers, bindActionCreators } from 'redux'; import { Provider, connect } from 'react-redux'; import thunk from 'redux-thunk'; import * as screenActions from './redux/actions/screenActions'; import * as reducers from './redux/stores/reducers'; const createStoreWithMiddleware = applyMiddleware(thunk)(createStore); const reducer = combineReducers(reducers); const store = createStoreWithMiddleware(reducer); import RootContainer from './redux/views/containers/rootContainer'; class App extends Component { render() { const { state, actions } = this.props; return ( <Provider store={store}> <RootContainer /> </Provider> ); } } export default connect( (state) => ({ state: state.reducer }), (dispatch) => ({ actions: bindActionCreators(screenActions, dispatch) }) )(App);
Error: Could not find "store" in the context of "Connect(UserInfoReduxComponent)". This error means that we are trying to render a component with Enzyme that is now closely related to Redux, without providing any Redux context. The component has no access to the store.
Provider, passes the store to the component nested within it and generally only needed to be applied to the root component (in your case <RootContainer>
connect
connect with the component providing store and not the component that has store provided to it.
MOVE the connect
to the <RootContainer>
component file instead, and pass connect
the RootContainer and not the App component:
export default connect( (state) => ({ state: state.reducer }), (dispatch) => ({ actions: bindActionCreators(screenActions, dispatch) }) )(RootContainer); // <<--- here :)
Given the OP wants to achieve all of this in the same file, you'll have to create a React element that represents your Redux container created from connect, so:
'use strict'; import React, { Component } from 'react'; import { createStore, applyMiddleware, combineReducers, bindActionCreators } from 'redux'; import { Provider, connect } from 'react-redux'; import thunk from 'redux-thunk'; import * as screenActions from './redux/actions/screenActions'; import * as reducers from './redux/stores/reducers'; const createStoreWithMiddleware = applyMiddleware(thunk)(createStore); const reducer = combineReducers(reducers); const store = createStoreWithMiddleware(reducer); import RootContainer from './redux/views/containers/rootContainer'; // name has to be capitalised for React to recognise it as an element in JSX const ConnectedRoot = connect( (state) => ({ state: state.reducer }), (dispatch) => ({ actions: bindActionCreators(screenActions, dispatch) }) )(RootContainer); class App extends Component { render() { const { state, actions } = this.props; return ( <Provider store={store}> <ConnectedRoot /> <------USE IT HERE </Provider> ); } }
I had such a problem when I used:
import connect from "react-redux/lib/connect/connect";
instead of that, use:
import {connect} from "react-redux";
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With