All Projects → merisbahti → klyva

merisbahti / klyva

Licence: MIT license
A state management library that follows the React component model

Programming Languages

typescript
32286 projects

Projects that are alternatives of or similar to klyva

entangle
Global state management tool for react hooks inspired by RecoilJS and Jotai using proxies.
Stars: ✭ 26 (-50.94%)
Mutual labels:  atom, hook
Registration-and-Login-using-MERN-stack
Simple Registration and Login component with MERN stack
Stars: ✭ 210 (+296.23%)
Mutual labels:  react-components
cnode-react
a web app for cnode.org with react + react-router + react-redux
Stars: ✭ 23 (-56.6%)
Mutual labels:  react-components
language-rainmeter
Syntax highlighting for Rainmeter files in Atom.
Stars: ✭ 19 (-64.15%)
Mutual labels:  atom
KeyBoardTool
Keyboard key detection software realized by Qt(Qt实现的键盘按键检测软件)
Stars: ✭ 35 (-33.96%)
Mutual labels:  hook
svg-to-swiftui-core
Headless package for converting SVG to SwiftUI
Stars: ✭ 25 (-52.83%)
Mutual labels:  hook
cake-atom-syntax
Yummy syntax theme for Atom
Stars: ✭ 17 (-67.92%)
Mutual labels:  atom
react-sanctum
Easily hook up your React app to Laravel Sanctum and Laravel Fortify
Stars: ✭ 100 (+88.68%)
Mutual labels:  react-components
laminas-feed
Consume and generate Atom and RSS feeds, and interact with Pubsubhubbub.
Stars: ✭ 97 (+83.02%)
Mutual labels:  atom
best-of-react
🏆 A ranked list of awesome React open-source libraries and tools. Updated weekly.
Stars: ✭ 364 (+586.79%)
Mutual labels:  react-components
subhook.nim
subhook wrapper for Nim https://github.com/Zeex/subhook
Stars: ✭ 15 (-71.7%)
Mutual labels:  hook
language-viml
Vim script syntax highlighting for Atom and GitHub.
Stars: ✭ 19 (-64.15%)
Mutual labels:  atom
Uatu
Android方法调用跟踪 ; 方法耗时统计 ; 方法调用参数以及返回值跟踪 ; 方法调用替换;方法hook
Stars: ✭ 93 (+75.47%)
Mutual labels:  hook
objects-hooks-remover
Package to remove WordPress hook callbacks that uses object methods or closures.
Stars: ✭ 44 (-16.98%)
Mutual labels:  hook
stacktrace
Atom package to navigate stacktraces.
Stars: ✭ 35 (-33.96%)
Mutual labels:  atom
usehooks-ts
React hook library, ready to use, written in Typescript.
Stars: ✭ 2,873 (+5320.75%)
Mutual labels:  hook
bezier-react
React components library that implements Bezier Design System.
Stars: ✭ 85 (+60.38%)
Mutual labels:  react-components
nxdk-rdt
Remote Dev Tool is a tool to remote control an Xbox using memory access and RPC
Stars: ✭ 23 (-56.6%)
Mutual labels:  hook
language-mjml
Atom Editor package providing syntax support for MJML
Stars: ✭ 48 (-9.43%)
Mutual labels:  atom
resource-center
New version of the resource center built with ReactJS
Stars: ✭ 89 (+67.92%)
Mutual labels:  react-components

🪓 klyva

Scalable state management for React.

Minimal API, with reactive, composable and decomposable state!

📺 10 minute tutorial

How to

Create an atom

A base atom can be constructed by giving the atom a value.

const countAtom = atom(5)

useAtom

The useAtom hook subscribes to changes to the atom, so if it's updated, then this component is notified and updated. The hook is similar to react's useState in that it gives a setState function.

const MyComponent = () => {
  const [value, setValue] = useAtom(countAtom)
  const increase = () => setValue(oldValue => oldValue + 1)
  return <button onClick={increase}>{value}</button>
}

Composition

Atoms are composable. Meaning that you can glue together two atoms using the get function, when any dependant atoms are updated, the derived atom is updated:

const atomOne = atom(10)
const atomTwo = atom(20)
const sumAtom = atom(get => get(atomOne) + get(atomTwo))

Decomposition

You can focus on a smaller part of an atom, to view and update that smaller part (focusedAtom) - which in turn updates the derivee (objectAtom).

const objectAtom = atom({a: 10})
const focusedAtom = focusAtom(objectAtom, optic => optic.prop('a'))

const MyComponent = () => {
  const [value, setValue] = useAtom(focusedAtom)
  const increase = () => setValue(oldValue => oldValue + 1)
  return <button onClick={increase}>{value}</button>
}

See more about optics at: https://github.com/akheron/optics-ts

Usage outside of react

Get value

Use the getValue function to get the atoms current value:

const counterAtom = atom(0)
counterAtom.getValue() // 0

Update it

Atoms have an update function, which can be used to update it outside of react:

const numberAtom = atom(5)

numberAtom.update(6)
numberAtom.update(value => value + 1)

Subscribe

Use the subscribe function to subscribe to changes for this atom:

const counterAtom = atom(0)
counterAtom.subscribe(count => console.log(`The count is: ${count}`))
counterAtom.update(count => count + 1)
// console: The count is: 1

Advanced example

When you have an atom which contains a list, and you want to delegate control of each list item, you can use the useAtomSlice-hook like this:

const listAtom = atom([0,0,0])

const CounterList = () => {
  const counterAtoms = useAtomSlice(listAtom)
  const addCounter = () => listAtom.update(counters => [...counters, 0])
  return (
    <>
      <ul>
        {counterAtoms.map((atom) => <Counter counterAtom={atom} onRemove={atom.remove} />)}
      </ul>
      <button onClick={addCounter}>
        Add counter
      </button>
    </>
  )
}

const Counter = ({counterAtom, onRemove}: {counterAtom: Atom<number>, onRemove: () => void}) => {
  const [count, setCount] = useAtom(counterAtom)
  return (
    <li>
      <button onClick={() => setCount(v => v + 1)}>{count}</button>
      <button onClick={onRemove}>Remove me</button>
    </li>
  )
}

Curious? See codesandbox!

Differences from jotai and recoil

  • No <Provider> needed
  • No key needed for atom
  • More performant: Atoms are minimally expensive to create, and you can create them almost for free in react components.
  • Usage outside of react components is supported, so you can listen to changes and update atoms from outside of a react context.

Install

Using npm

npm i klyva

Using yarn

yarn add klyva
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].