pedronauck / reworm
- среда, 22 августа 2018 г. в 00:15:40
TypeScript
the simplest way to manage state!
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.
Install reworm using your package manager
$ yarn add reworm
Then just create your new state and use it!
import React from 'react'
import { create } from 'reworm'
const { State, get } = create({ name: 'John' })
const App = () => (
<State>
<div>{get(s => s.name)}</div>
</State>
)
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 { create } from 'reworm'
const { State, set, get } = create({ name: 'John' })
class App extends React.Component {
componentDidMount() {
set(prev => ({ name: 'Peter' + prev.name }))
}
render() {
return (
<State>
<div>{get(s => s.name)}</div>
</State>
)
}
}
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 { create } from 'reworm'
const { State, select } = create({ list: ['Peter', 'John'] })
const johnSelector = select(s =>
s.list.filter(user => user.includes('Peter'))
)
const App = () => (
<State>
<div>{johnSelector(user => user)}</div>
</State>
)
create<T>(initial?: T): State
Create a new state
State<T>: ReactComponent<{ initial?: T }>
Use this component as wrapper when you want to access your 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(selector: (state: T) => T) => (fn: GetFn<T>) => React.ReactNode
Create selectors that can be used with your state and avoid repeating code.
import React from 'react'
import { create } from 'reworm'
const { State, select } = create({ name: 'John' })
const userSelector = select(s => s.name)
const App = () => (
<State>
{userSelector}
</State>
)
interface ProviderProps<T> {
initial?: T
}
type PrevState<T> = (prevState: T) => T
type GetFn<T> = (state: T) => React.ReactNode
interface State<T> {
get: (fn: GetFn<T>) => React.ReactNode
set: (param: T | PrevState<T>) => void
select: (selector: (state: T) => T) => (fn: GetFn<T>) => React.ReactNode
State: React.ComponentType<ProviderProps<T>>
}
function create<T>(initial: T) => State<T>
If you want to contribute to this project, please see our Contributing Guide !