DEV Community

Dennis Cual
Dennis Cual

Posted on • Edited on

1 1

Fun to use state management for your React

When managing your React state, your state manager should only give you simple works to do the job even though that you are maintaining huge state. small is the new big. Yes indeed! It must only give you small utilities to manage it and will be sufficed. It means that it must have minimal API.

easy-react-state gives you this kind of features and use it in fun and easy way. It is like bigger version of React.useState hook but managing different state. It also has smaller API surface so you don't need to learn many stuffs just to make it right.

Let's take a look on how we can use the awesome library:

1 - Configuring your store

NOTE: easy-react-state uses immerjs. So when updating a state, you can use any syntax. This is very handy especially if you change nested property's value. You can use mutator syntax just like state.user.name = 'Zion'.

const configAppStore = {
  todos: {
    initialState: [],
    setters: state => ({
      addTodo(todo) {
        state.push(todo)
        return state
      },
    }),
  },
}

2 - Creating state manager based on your store

NOTE: The returned useSelector will subscribe to the store based on the data which user need and will only re-render the Consumer Component if and only if the subscribed data will change even though the root state gets updated.

const [useAppSelector, appSetters] = createStateManager(configAppStore)

3 - Consume to your React Component

NOTE: We don't need a Provider to consume the store. Just create a manager, then you can use it directly.

const App = () => {
  const todos = useAppSelector(state => state.todos)
  console.log('todos', todos)
  return (
    <div>
      <h3>Todos Control</h3>
      <button
        onClick={() => {
          const todo = {
            id: `todo-${Date.now()}`,
            label: `Todo ${Date.now()}`,
          }
          appSetters.todos.addTodo(todo)
        }}
      >
        Add todo
      </button>
    </div>
  )
}

Pretty simple right? How about async updates? This is easy.

Because the setters are just object which are created outside the Component, then you can call it wherever you want. For an instance, call it inside async function:

const [useAppSelector, appSetters] = createStateManager(configAppStore)

async function fetchUsers() {
  appSetters.users.loading()
  try {
    const res = await apiUsers()
    appSetters.users.setUsers(res)
  } catch (err) {
    appSetters.users.setError(err)
  }
}

And thats it! If you are interested and want to try, you can check its github repo for more info. Of course, it is open-source and feel free to give feedbacks and contribute!

Image of Datadog

Create and maintain end-to-end frontend tests

Learn best practices on creating frontend tests, testing on-premise apps, integrating tests into your CI/CD pipeline, and using Datadog’s testing tunnel.

Download The Guide

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay