All Projects → pmndrs → Jotai

pmndrs / Jotai

Licence: mit
👻 Primitive and flexible state management for React

Programming Languages

typescript
32286 projects
javascript
184084 projects - #8 most used programming language
CSS
56736 projects

Projects that are alternatives of or similar to Jotai

Tlroadmap
Тимлид – это ❄️, потому что в каждой компании он уникален и неповторим.
Stars: ✭ 4,398 (-31.85%)
Mutual labels:  management, hacktoberfest
Kiwi
the leading open source test management system
Stars: ✭ 607 (-90.59%)
Mutual labels:  management, hacktoberfest
Useeffectreducer
useReducer + useEffect = useEffectReducer
Stars: ✭ 642 (-90.05%)
Mutual labels:  hacktoberfest, state
Metasfresh
We do Open Source ERP - Fast, Flexible & Free Software to scale your Business.
Stars: ✭ 807 (-87.49%)
Mutual labels:  management, hacktoberfest
Outstated
Simple hooks-based state management for React
Stars: ✭ 102 (-98.42%)
Mutual labels:  management, state
Store
A beautifully-simple framework-agnostic modern state management library.
Stars: ✭ 204 (-96.84%)
Mutual labels:  management, state
Statty
A tiny and unobtrusive state management library for React and Preact apps
Stars: ✭ 516 (-92%)
Mutual labels:  management, state
Unstated
State so simple, it goes without saying
Stars: ✭ 7,785 (+20.64%)
Mutual labels:  management, state
Kmon
Linux Kernel Manager and Activity Monitor 🐧💻
Stars: ✭ 1,142 (-82.3%)
Mutual labels:  management, hacktoberfest
Stencil Store
Store is a lightweight shared state library by the StencilJS core team. Implements a simple key/value map that efficiently re-renders components when necessary.
Stars: ✭ 107 (-98.34%)
Mutual labels:  management, state
teaful
🍵 Tiny, easy and powerful React state management
Stars: ✭ 638 (-90.11%)
Mutual labels:  management, state
Guark
Build awesome Golang desktop apps and beautiful interfaces with Vue.js, React.js, Framework 7, and more...
Stars: ✭ 334 (-94.82%)
Mutual labels:  hacktoberfest
Flopflip
🎚Flip or flop features in your React application in real-time backed by flag provider of your choice 🚦
Stars: ✭ 334 (-94.82%)
Mutual labels:  hacktoberfest
Kmeans
k-means clustering algorithm implementation written in Go
Stars: ✭ 332 (-94.86%)
Mutual labels:  hacktoberfest
Dev Ios
DEV Community iOS App
Stars: ✭ 334 (-94.82%)
Mutual labels:  hacktoberfest
Netcdf C
Official GitHub repository for netCDF-C libraries and utilities.
Stars: ✭ 336 (-94.79%)
Mutual labels:  hacktoberfest
Pandas alive
Create stunning, animated visualisations with Pandas & Matplotlib as easy as calling `df.plot_animated()`
Stars: ✭ 333 (-94.84%)
Mutual labels:  hacktoberfest
Nnstreamer
🔀 Neural Network (NN) Streamer, Stream Processing Paradigm for Neural Network Apps/Devices.
Stars: ✭ 329 (-94.9%)
Mutual labels:  hacktoberfest
Open Pixel Art
A collaborative pixel art project to teach people how to contribute to open-source
Stars: ✭ 331 (-94.87%)
Mutual labels:  hacktoberfest
Iproute2 Cheatsheet
iproute2 command reference
Stars: ✭ 330 (-94.89%)
Mutual labels:  hacktoberfest

jotai

Primitive and flexible state management for React

npm i jotai

Build Status Build Size Version Downloads Discord Shield Open Collective

Jotai is pronounced "joe-tie" and means "state" in Japanese.

You can try live demos in the following: Demo 1 | Demo 2.

How does Jotai differ from Recoil?

  • Minimalistic API
  • No string keys
  • TypeScript oriented

First create a primitive atom

An atom represents a piece of state. All you need is to specify an initial value, which can be primitive values like strings and numbers, objects and arrays. You can create as many primitive atoms as you want.

import { atom } from 'jotai'

const countAtom = atom(0)
const countryAtom = atom('Japan')
const citiesAtom = atom(['Tokyo', 'Kyoto', 'Osaka'])
const mangaAtom = atom({ 'Dragon Ball': 1984, 'One Piece': 1997, Naruto: 1999 })

Use the atom in your components

It can be used like React.useState:

import { useAtom } from 'jotai'

function Counter() {
  const [count, setCount] = useAtom(countAtom)
  return (
    <h1>
      {count}
      <button onClick={() => setCount(c => c + 1)}>one up</button>

Create derived atoms with computed values

A new read-only atom can be created from existing atoms by passing a read function as the first argument. get allows you to fetch the contextual value of any atom.

const doubledCountAtom = atom((get) => get(countAtom) * 2)

function DoubleCounter() {
  const [doubledCount] = useAtom(doubledCountAtom)
  return <h2>{doubledCount}</h2>

Recipes

Creating an atom from multiple atoms

You can combine multiple atoms to create a derived atom.

const count1 = atom(1)
const count2 = atom(2)
const count3 = atom(3)

const sum = atom((get) => get(count1) + get(count2) + get(count3))

Or if you like fp patterns ...

const atoms = [count1, count2, count3, ...otherAtoms]
const sum = atom((get) => atoms.map(get).reduce((acc, count) => acc + count))

Derived async atoms needs suspense

You can make the read function an async function too.

const urlAtom = atom("https://json.host.com")
const fetchUrlAtom = atom(
  async (get) => {
    const response = await fetch(get(urlAtom))
    return await response.json()
  }
)

function Status() {
  // Re-renders the component after urlAtom changed and the async function above concludes
  const [json] = useAtom(fetchUrlAtom)

You can create a writable derived atom

Specify a write function at the second argument. get will return the current value of an atom. set will update an atoms value.

const decrementCountAtom = atom(
  (get) => get(countAtom),
  (get, set, _arg) => set(countAtom, get(countAtom) - 1),
)

function Counter() {
  const [count, decrement] = useAtom(decrementCountAtom)
  return (
    <h1>
      {count}
      <button onClick={decrement}>Decrease</button>

Write only atoms

Just do not define a read function.

const multiplyCountAtom = atom(null, (get, set, by) => set(countAtom, get(countAtom) * by))

function Controls() {
  const [, multiply] = useAtom(multiplyCountAtom)
  return <button onClick={() => multiply(3)}>triple</button>

Async actions

Just make the write function an async function and call set when you're ready.

const fetchCountAtom = atom(
  (get) => get(countAtom),
  async (_get, set, url) => {
    const response = await fetch(url)
    set(countAtom, (await response.json()).count)
  }
)

function Controls() {
  const [count, compute] = useAtom(fetchCountAtom)
  return <button onClick={() => compute("http://count.host.com")}>compute</button>

Installation notes

This package requires some peer dependencies, which you need to install by yourself.

yarn add jotai react

Learn Jotai

free egghead Jotai introduction course by Daishi

More documents

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].