All Projects → pedronauck → Reworm

pedronauck / Reworm

Licence: mit
🍫 the simplest way to manage state

Programming Languages

typescript
32286 projects

Projects that are alternatives of or similar to Reworm

Reatom
State manager with a focus of all needs
Stars: ✭ 567 (-61.35%)
Mutual labels:  state-management, state
Revived
A redux-inspired predictable state container for python
Stars: ✭ 12 (-99.18%)
Mutual labels:  state-management, state
Little State Machine
📠 React custom hook for persist state management
Stars: ✭ 654 (-55.42%)
Mutual labels:  state-management, state
Constate
React Context + State
Stars: ✭ 3,519 (+139.88%)
Mutual labels:  state-management, react-context
Alveron
Elm & Reason inspired state management for React
Stars: ✭ 57 (-96.11%)
Mutual labels:  state-management, state
Machinery
State machine thin layer for structs (+ GUI for Phoenix apps)
Stars: ✭ 367 (-74.98%)
Mutual labels:  state-management, state
Redux Tree
An alternative way to compose Redux reducers
Stars: ✭ 23 (-98.43%)
Mutual labels:  state-management, state
Govern
Component-based state management for JavaScript.
Stars: ✭ 270 (-81.6%)
Mutual labels:  state-management, state
Duix
A State Manager focused on KISS and Pareto's Principle
Stars: ✭ 48 (-96.73%)
Mutual labels:  state-management, state
Use Global Context
A new way to use “useContext” better
Stars: ✭ 34 (-97.68%)
Mutual labels:  state-management, state
Effector
The state manager ☄️
Stars: ✭ 3,572 (+143.49%)
Mutual labels:  state-management, state
React Composition Api
🎨 Simple React state management. Made with @vue/reactivity and ❤️.
Stars: ✭ 67 (-95.43%)
Mutual labels:  state-management, state
Redux Orm
A small, simple and immutable ORM to manage relational data in your Redux store.
Stars: ✭ 2,922 (+99.18%)
Mutual labels:  state-management, state
Westore
更好的小程序项目架构
Stars: ✭ 3,897 (+165.64%)
Mutual labels:  state-management, state
React Recomponent
🥫 Reason-style reducer components for React using ES6 classes.
Stars: ✭ 272 (-81.46%)
Mutual labels:  state-management, state
Pullstate
Simple state stores using immer and React hooks - re-use parts of your state by pulling it anywhere you like!
Stars: ✭ 683 (-53.44%)
Mutual labels:  state-management, state
k-ramel
State manager for your components apps, the safe and easy way
Stars: ✭ 20 (-98.64%)
Mutual labels:  state-management, state
alveron-old
Opinionated Elm-inspired Redux Component Architecture for React
Stars: ✭ 17 (-98.84%)
Mutual labels:  state-management, state
Concent
State management that tailored for react, it is simple, predictable, progressive and efficient.
Stars: ✭ 882 (-39.88%)
Mutual labels:  state-management, state
Yewdux
Redux-like state containers for Yew apps
Stars: ✭ 58 (-96.05%)
Mutual labels:  state-management, state

🧐   Why?

Forget about actions, connections, reducers and a lot of boilerplate to create and manage states. With reworm you can create and manage state as simple as on the image above.

Todo List Example

💻   Install and Usage

Install reworm using your package manager

$ yarn add reworm

Then just wrap your app with our Provider, create your new state and use it!

import React from 'react'
import { Provider, create } from 'reworm'

const { get } = create('userStore', { name: 'John' })

const App = () => (
  <Provider>
    <div>{get(s => s.name)}</div>
  </Provider>
)

Change your state easily

Instead of defining actions or something else to change your state, with reworm you just need to use the set method like that:

import React from 'react'
import { Provider, create } from 'reworm'

const { set, get } = create('userStore', { name: 'John' })

class App extends React.Component {
  componentDidMount() {
    set(prev => ({ name: 'Peter' + prev.name }))
  }
  render() {
    return (
      <Provider>
        <div>{get(s => s.name)}</div>
      </Provider>
    )
  }
}

Using selectors

Selectors are good because they prevent you from duplicating code. With it you can just create some functions and use them throughout your application.

import React from 'react'
import { Provider, create } from 'reworm'

const { select } = create('userStore', { list: ['Peter', 'John'] })

const johnSelector = select(state =>
  state.list.find(user => user.includes('John'))
)

const App = () => (
  <Provider>
    <div>{johnSelector(user => user)}</div>
  </Provider>
)

Listening state changes

If you want to listen changes on your state you can use subscribe():

import React from 'react'
import { Provider, create } from 'reworm'

const user = create('userStore')

class App extends Component {
  state = {
    name: 'John'
  }

  componentDidMount() {
    user.subscribe(name => this.setState({ name }))
    user.set('Michael')
  }

  render() {
    return <div>Hello {this.state.name}</div>
  }
}

Hooks

If you want to use hooks you can use the useReworm:

import React, { useEffect } from 'react'
import { Provider, create, useReworm } from 'reworm'

const store = create('userStore', { name: 'John' })

const App = () => {
  const { get, set } = useReworm('userStore')
  useEffect(() => {
    set(prev => ({ name: 'Peter' + prev.name }))
  }, []);

  return (
    <Provider>
      <div>{get(s => s.name)}</div>
    </Provider>
  )
}

🔎   API

create<T>(storeName: string, initial?: T): State

Create a new state

get((state: T) => React.ReactNode)

Use this method to access your state

set((state: T | (prevState: T) => T) => T)

Use this method to set your state

select<S = any>(selector: (state: T) => S) => (fn: GetFn<T>) => React.ReactNode

Create selectors that can be used with your state and avoid repeating code.

subscribe: (fn: SubscribeFn<T>) => () => void

Use this method to listen state changes

📝   Typings

type PrevState<T> = (prevState: T) => T
type GetFn<T> = (state: T) => React.ReactNode
type SubscribeFn<T> = (state: T) => any

interface State<T> {
  get: (fn: GetFn<T>) => React.ReactNode
  set: (next: T | PrevState<T>) => void
  select: <S = any>(
    selector: (state: T) => S
  ) => (fn: GetFn<S>) => React.ReactNode
  subscribe: (fn: SubscribeFn<T>) => () => void
}

function create<T>(storeName: string, initial: T) => State<T>

🕺   Contribute

If you want to contribute to this project, please see our Contributing Guide !

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].