Design Patterns with React Easy State
Codesandbox may be slow on mobile, don’t worry if it takes some time. Just come back here a bit later or try the live app here.
Sharing global state between components
React’s state
and setState
is often enough for managing local state, but big projects tend to need more. Some information is better saved globally.
JavaScript objects are singletons and they can be shared between files with ES6 import
and export
. This makes them a perfect candidate for storing global state.
Notice how thefetchBeers
method usesappStore.beers
instead ofthis.beers
. It is a neat trick, which makes object methods safe to be passed as callbacks.
Don’t worry about the dummy fetchBeers
method yet, we will smarten it up later. The appStore
can be imported and used in any file — like the below NavBar
component.
We need another component to display the fetched beers. Naturally it also has to import the global appStore
to map a view to its beers
array.
Easy State re-renders the aboveNavBar
andBeerList
components whenappStore.isLoading
orappStore.beers
changes.
Async actions
Let’s breathe life into the fetchBeers
method. There is not much to change: it should be turned into an async
method and it should fetch the beers from an API, instead of faking them.
An ideal store is only responsible of state manipulation and nothing else. Abstracting away the view related logic in the components and the networking logic in an API layer is a good practice. This could mean destructuring events in the components’ event handlers and handling authentication and headers in a separate API layer.
Our API is a simple one. It has a single function, which fetches matching beers for a passed food .
This example uses the Punk API to find beers. Check it out if you need some free data for your coding demos.
Encapsulating local state
Global state is crucial for big applications, but local state can be just as handy: it improves project structure and reusability. It is your responsibility to decide when to use which.
We are still missing a Beer
component, which could use some local state to switch between a picture and a description view. Putting a state store object on the component as a property is a simple way of implementing this.
Easy State re-renders theBeer
component wheneverstore.details
changes. It doesn’t matter if it is a local store or a shared global one, you can even mix the two in a single component.
The details
flag toggles between the two views of the beer card. It could also be stored on the beer object itself, but putting it in an isolated local store is a cleaner approach. It stores view related metadata, which should not pollute the real data.
Conclusion
Npm is packed with amazing tools, which simplify front-end development by a huge amount. Never hesitate to use them when you need them, but always think before you install. Sometimes you can be more productive with less tools.
Some of you wouldn’t even call the above snippets patterns. They are just code examples, that most developers are familiar with. Still, they were more than enough for a creating small app.
If this article captured your interest please help by sharing it. Also check out the Easy State repo and leave a star before you go.
Thank you!