npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

react-shared-mutable-state

v0.0.3

Published

Sharing state across multiple React trees using React's state management

Downloads

14

Readme

React Shared Mutable State

This project is built on a few beliefs:

  • React's state management is good.
  • Single Page Applications (SPAs) are not a silver bullet.
  • Multiple React trees are a sufficient (if not ideal!) architecture in many situations.
  • React's state management is good.

What does it do?

The ideal of having a single-atom-of-state that is used to render a single React tree is not possible in some architectures. This can be by legacy, or by choice. For these situations, having shared mutable state is necessary, and we want to manage it well.

Usage

Mount a single <Store/> component. This component owns the shared mutable state. It is an uncontrolled component, excepting one prop: defaultState.

Read shared mutable state anywhere in a React tree using <GetState />.

Example:

<GetState>
  {(sharedMutableState) => (
    <pre>
      {JSON.stringify(sharedMutableState, null, 2)}
    </pre>
  )}
</GetState>

Write shared mutable state anywhere in a React tree using <SetState />

<SetState counter={3} />

Other APIs

Keeping things declarative in a React tree was the initial idea. If this ideal cannot be satisfied, the escape hatches getState() and setState() are provided.

  • getState() returns the state of the mounted <Store /> component. If the <Store /> isn't mounted, the default React state shape of {} is returned.
  • setState() calls setState on the mounted <Store /> component. If the <Store /> isn't mounted, an error is thrown.

Caveats

Infinite loops?

It's probably easy to create infinite loops by composing <GetState /> and <SetState /> together. Lodash's isEqual has been used to prevent the most obvious possibilities, but I wouldn't rule them out completely.

Resetting state?

Re-rendering <Store defaultState={nextState} /> with a new key will reset it's internal state, same as rendering any component with a new key within any React tree!

Multiple stores?

YAGNI for now. I played with the ideas of multiple stores. The indirection and complexity introduced didn't seem to solve any problems particularly well. The increase in API surface area wasn't worth the theoretical organization or performance gains. Team-localized conventions for what is written to <Store /> is my preferred path forward, for now. It's React state, we can store whatever we want in it!