Need help with sharing history between two ReactDOM.render conmonent. I did it with Redux but no lack with react-router v4.
Code: index.js -> firs ReactDOM.render
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import {AppContextProvider} from './context';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware, compose, combineReducers } from 'redux';
import reducerReducer from "./store/reducers/reducer";
import mapReducer from './store/reducers/map';
import {BrowserRouter} from "react-router-dom";
import thunk from 'redux-thunk';
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const rootReducer = combineReducers({
reducer: reducerReducer,
map: mapReducer
});
const store = createStore(rootReducer, composeEnhancers(applyMiddleware(thunk)));
ReactDOM.render(
<Provider store={store}>
<AppContextProvider>
<BrowserRouter>
<App />
</BrowserRouter>
</AppContextProvider>
</Provider>,
document.getElementById('root')
);
Code: Map.js -> second ReactDOM.render
const popUpHTML = (
<Provider store={store}>
<Router history={createBrowserHistory}>
<PopUpClick
name={name}
img={img}
id={id}
/>
</Router>
</Provider>
);
const addPopup = (popUpHTML, coordinates) => {
const el = document.createElement('div');
// el.className = "marker";
ReactDOM.render(popUpHTML, el);
const mapboxGlPopup = new mapboxgl.Popup({
closeButton: false,
offset: 16,
anchor: 'top'
}).setDOMContent(el)
.setLngLat(coordinates)
.addTo(map);
}
addPopup(popUpHTML, coordinates);
So I need to get on click same URL history, now i gor just URL replace.
This is my rendered Components, and they are two whole new instance:
React Component in dev tools.
Related
I did the exact instructions in this post: https://medium.com/#samueldinesh/setting-up-redux-devtools-a-simple-guide-3b386a6254fa
The error I got was:
This is my code:
import {StrictMode} from 'react'
import {createRoot} from 'react-dom/client'
import { createStore } from 'redux'
import { composeWithDevTools } from 'redux-devtools-extension'
import App from './App'
import './styles/globals.css'
import { store } from './store/store'
import { Provider } from 'react-redux'
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'
const rootElement = document.querySelector('#main')
const root = createRoot(rootElement)
const currentStore = createStore(
store,
composeWithDevTools()
)
root.render(
<StrictMode>
<Provider store={currentStore}>
<Router>
<Routes>
<Route path="/*" element={<App />} />
</Routes>
</Router>
</Provider>
</StrictMode>
)
What did I miss?
you are passing a store here. you should be passing rootReducer
const currentStore = createStore(
store,
composeWithDevTools()
)
// according to the link
const currentStore = createStore(
rootReducer,
composeWithDevTools()
)
I am trying to learn how to implement redux-persist into my project inorder to persist states in case of user refreshing the page, etc...
After modifying the required files, I have no errors yet my page is just white, nothing renders and I dont understand why..
Here is my code
import { ProcessReducer } from "./chat/chatReducer";
import { createStore, combineReducers } from "redux";
import { persistStore, persistReducer } from "redux-persist";
import storage from "redux-persist/lib/storage";
import token from "./login/token";
import isLoggedIn from "./login/isLoggedIn";
import userId from "./login/userId";
import img from "./Donation/ImageReducer";
import title from "./Donation/TitleReducer";
import amount from "./Donation/AmountReducer";
const rootReducer = combineReducers({
token_1: token,
isLoggedIn: isLoggedIn,
userId: userId,
ProcessReducer: ProcessReducer,
img: img,
title: title,
amount: amount,
});
const persistConfig = {
key: "root",
storage,
whitelist: [
"title",
"img",
"token_1",
"isLoggedIn",
"userId",
"ProcessReducer",
"amount",
],
};
export default persistReducer(persistConfig, rootReducer);
export const store = createStore(rootReducer);
export const persistor = persistStore(store);
and
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import {store,persistor} from "./reducers/index"
import { Provider } from "react-redux";
import { BrowserRouter as Router } from "react-router-dom";
import {PersistGate} from 'redux-persist/integration/react'
ReactDOM.render(
<Provider store={store}>
<Router>
<React.StrictMode>
<PersistGate persistor={persistor}>
<App />
</PersistGate>
</React.StrictMode>
</Router>
</Provider>,
document.getElementById('root')
);
I only modified these two files, can someone point me at what am I doing wrong ?
thank you
--- Bellow are my original files
import { ProcessReducer } from "./chat/chatReducer";
import { createStore, combineReducers } from "redux";
import token from "./login/token";
import isLoggedIn from "./login/isLoggedIn";
import userId from "./login/userId";
import img from "./Donation/ImageReducer";
import title from "./Donation/TitleReducer";
import amount from "./Donation/AmountReducer"
const reducers = combineReducers({
token_1: token,
isLoggedIn: isLoggedIn,
userId: userId,
ProcessReducer: ProcessReducer,
img: img,
title:title,
amount:amount
});
export const store = createStore(reducers);
export default store;
and
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import {store} from "./reducers/index"
import { Provider } from "react-redux";
import { BrowserRouter as Router } from "react-router-dom";
ReactDOM.render(
<Provider store={store}>
<Router>
<React.StrictMode>
<App />
</React.StrictMode>
</Router>
</Provider>,
document.getElementById('root')
);
Your implementation seems to be wrong. Let's review them step by step:
First, create a persistedReducer:
const persistedReducer = persistReducer(persistConfig, rootReducer);
Now, create the store using the persistedReducer (you used the rootReducer to create your store which is not correct)
const store = createStore(persistedReducer);
You create the store, one step forward, you need also a persist store:
const persistor = persistStore(store);
We done here, wrap them all together, and export essentials:
import {createStore} from 'redux';
import {persistStore, persistReducer} from 'redux-persist':
// other codes ...
const persistedReducer = persistReducer(persistConfig, rootReducer);
const store = createStore(persistedReducer);
const persistor = persistStore(store);
export {store, persistor}
Time to use the store and persistor in the App:
import {Provider} from 'react-redux';
import {PersistGate} from 'redux-persist/lib/integration/react';
import {store, persistor} from 'path/to/the/store';
const App = () => (
<Provider store={store}>
<PersistGate persistor={persistor}>
<MyApplication />
</PersistGate>
</Provider>
)
I just migrated to react-router, react-router dom v4.3.1, installed history v4.9. Earlier, all my components which were connected to the store, got router props. Now, they say that there must be a history prop. However, I dont get it anywhere, especially in App component.
Root:
import React, { Component } from "react";
import { Provider } from "react-redux";
// import { BrowserRouter, Route, browserHistory, Switch } from "react-router";
import { BrowserRouter as Router, Route, Switch} from "react-router-dom";
import { hot } from 'react-hot-loader'
import { ConnectedRouter } from 'connected-react-router'
import configureStore, {history} from '../store/configureStore'
import App from "./App";
import Startpage from "./startpage";
import PatientSearch from "./routes/patient/patientSearch";
import Technician from "./routes/technician/technician";
import Notes from "./routes/notes/notes";
import DeliveryReports from './routes/admin/deliveryReports/reports'
const store = configureStore(/* provide initial state if any */)
class Root extends Component {
render() {
console.log('propsroot', this.props)
return (
<Provider store={store}>
<ConnectedRouter history={history}>
{/*<Router onUpdate={() => window.scrollTo(0, 0)}>*/}
<App>
<Switch>
<Route exact path="/" component={Startpage} />
<Route
component={PatientSearch}
path="/patient/search"
/>
<Route
component={Technician}
path="/technician"
/>
<Route
component={Notes}
path="/notes"
/>
<Route
component={DeliveryReports}
path="/delivery_reports"
/>
</Switch>
</App>
{/*</Router>*/}
</ConnectedRouter>
</Provider>
);
}
}
export default hot(module)(Root)
ConfigureStore:
import { createStore, applyMiddleware, combineReducers, compose } from 'redux';
import thunkMiddleware from 'redux-thunk';
import { connectRouter } from 'connected-react-router'
import promiseMiddleware from '../middleware/promiseMiddleware';
import loggerMiddleware from 'redux-logger';
import * as reducers from '../reducers/';
import { reducer as formReducer } from 'redux-form'
import app from '../reducers/app'
import {createBrowserHistory} from "history";
export const history = createBrowserHistory()
const reducer = combineReducers({...reducers.default, router:connectRouter(history), form:formReducer });
const createStoreWithMiddleware = applyMiddleware(
thunkMiddleware,
promiseMiddleware
)(createStore);
export default function configureStore(initialState) {
const store = createStoreWithMiddleware(
reducer,
initialState,
window.devToolsExtension && window.devToolsExtension()
);
if (module.hot) {
module.hot.accept('../reducers', () => {
const nextRootReducer = require('../reducers/index');
store.replaceReducer(nextRootReducer);
});
}
return store;
}
In App component I render routes with {children} props
The history prop is provided by your provider. To serialize it in you component's props use the withRoute HOC
I upgraded to use react-router v4 (rr-v4) and read that react-router-redux has been deprecated and for rr-v4 to use connected-react-router. In doing so I now get the following error:
The prop location is marked as required in ConnectedRouter, but
its value is undefined.
I can't seem to figure out what I've done wrong. I have quite a bit of code so I'm going to try and share what is relevant:
rootReducer:
import { combineReducers } from 'redux';
import { connectRouter } from 'connected-react-router'
import { reducer as oidcReducer } from 'redux-oidc';
...
const rootReducer = (history) => combineReducers({
routing: connectRouter(history),
oidc: oidcReducer,
...
export default rootReducer;
store.js:
import { createStore, applyMiddleware, compose } from 'redux';
import { routerMiddleware } from 'connected-react-router'
import { createBrowserHistory } from 'history'
...
export const history = createBrowserHistory()
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const initialState = {};
const createStoreWithMiddleware = composeEnhancers(
applyMiddleware(loggerMiddleware, routerMiddleware(history), thunkMiddleware)
)(createStore);
const store = createStoreWithMiddleware(rootReducer(history), initialState);
...
export default store;
index.js:
import React from 'react';
import { render } from 'react-dom';
import { Provider } from 'react-redux';
import { OidcProvider } from 'redux-oidc';
import store, { history } from './store';
import { App } from './App';
import userManager from './_helpers/userManager';
import { ErrorBoundary } from './_components/ErrorBoundary';
import "./web.config";
render(
<ErrorBoundary>
<Provider store={store}>
<OidcProvider store={store} userManager={userManager}>
<App history={history} />
</OidcProvider>
</Provider>
</ErrorBoundary>,
document.getElementById('app')
);
App.js:
import React from 'react';
import { ConnectedRouter } from 'connected-react-router'
import { Route, Switch } from 'react-router-dom';
...
class App extends React.Component {
constructor(props) {
super(props);
const { dispatch } = this.props;
}
...
render() {
const { history } = this.props;
return (
<ConnectedRouter history={history}>
<div>
<Route path="/" render={() => (<div>HOME</div>)} />
<Route path="/test" render={() => (<div>TEST</div>)} />
</div>
</ConnectedRouter>
);
}
}
The key under your rootReducer must be router, not routing.
Am new in reactjs and am developing a small signup functionality with react-redux but am facing this error. I was following a certain tutorial but it seems am stuck right now
Below is my code :
Signup.js
import React, { Component } from 'react';
import NavBar from './subcomponents/NavBar'
import SignUpForm from './subcomponents/SignUpForm'
import { connect } from 'react-redux'
import {userSignUpRequest} from "./actions/signUpActions";
import PropTypes from 'prop-types';
class Signup extends Component {
render() {
const {userSignUpRequest} = this.props;
return (
<div>
<NavBar/>
<SignUpForm userSignUpRequest={userSignUpRequest}/>
</div>
);
}
}
Signup.propTypes = {
userSignUpRequest: PropTypes.func.isRequired
}
export default connect(null, { userSignUpRequest })(Signup);
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './redux-js/index';
import App from "./App";
import {applyMiddleware, createStore} from "redux";
import thunk from "redux-thunk";
const store = createStore(
(state = {}) => state,
applyMiddleware(thunk)
);
ReactDOM.render(
<provider store={store}>
<App />
</provider>
, document.getElementById('root'));
Error
Could not find "store" in either the context or props of
"Connect(Signup)". Either wrap the root component in a <Provider>, or
explicitly pass "store" as a prop to "Connect(Signup)"
Solution
You need to import the Provider in your index.js file:
import React from 'react';
import ReactDOM from 'react-dom';
import './redux-js/index';
import App from "./App";
import {applyMiddleware, createStore} from "redux";
import thunk from "redux-thunk";
import { Provider } from 'react-redux'; //added
const store = createStore(
(state = {}) => state,
applyMiddleware(thunk)
);
ReactDOM.render(
<Provider store={store}> //fixed typo
<App />
</Provider >
, document.getElementById('root'));
You need to wrap the App component with Provider component imported from 'react-redux'
import { Provider } from 'react-redux';
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>
, document.getElementById('root'));