Last active
January 5, 2022 18:45
-
-
Save gaearon/eeee2f619620ab7b55673a4ee2bf8400 to your computer and use it in GitHub Desktop.
Breaking out of Redux paradigm to isolate apps
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import React, { Component } from 'react' | |
import Subapp from './subapp/Root' | |
class BigApp extends Component { | |
render() { | |
return ( | |
<div> | |
<Subapp /> | |
<Subapp /> | |
<Subapp /> | |
</div> | |
) | |
} | |
} | |
// These subapps will be completely independent. | |
// | |
// They won't share data or actions, and won't see or communicate with each other. | |
// If you mix this approach with standard Redux approach of composing reducers, it | |
// will get extremely confusing so it's best if you pick just one: either your app | |
// is composed of pieces that follow Redux pattern holistically, or your app is so | |
// large and disjointed that smaller independent "subapps" make more sense. | |
// | |
// The first case is probably closer to normal web products, and the second case is | |
// closer to a "product hub", a "dashboard", or enterprise software where unrelated | |
// tools are grouped together because they're part of one package. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This is our subapp's root connected component. | |
// It can render more components, connected or not, below, just like normally. | |
// Usually we'd render it in <Provider> and be done with it. | |
class App extends Component { ... } | |
export default connect(mapStateToProps)(App) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// However we don't have to call ReactDOM.render(<Provider><App /></Provider>) | |
// if we're interested in hiding the fact that it's a Redux app. | |
// | |
// Maybe we want to be able to run multiple instances of it in the same "bigger" app | |
// and keep it as a complete black box, with Redux being an implementation detail. | |
// To hide Redux behind a React API, we can wrap it in a special component that | |
// initializes the store in the constructor. This way every instance will be independent. | |
// | |
// Note that this is *not* recommended for parts of the same app that share data. | |
// But it can be useful when the bigger app has zero access to smaller apps' internals, | |
// and we'd like to keep the fact that they are implemented with Redux an implementation detail. | |
// Each component instance will have its own store, so they won't "know" about each other. | |
import React, { Component } from 'react' | |
import { Provider } from 'react-redux' | |
import reducer from './reducers' | |
import App from './App' | |
class Root extends Component { | |
constructor(props) { | |
super(props) | |
this.store = createStore(reducer) | |
} | |
render() { | |
return ( | |
<Provider store={this.store}> | |
<App /> | |
</Provider> | |
) | |
} | |
} |
How about using a subApp as a child of another subApp like this?
return(
<SubApp1>
<SubApp2/>
</SubApp1>
)
Suppose the SupApp2 is a calendar app or something which should be used inside of SubApp1, but there are no shared components between these 2 subApps.
Is it possible?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@Nathaniel-Fernandes @gaearon any advice with dispatching scoped actions?