Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jxnblk/refunk
:headphones: Simple React functional setState
https://github.com/jxnblk/refunk
functional react setstate state
Last synced: 19 days ago
JSON representation
:headphones: Simple React functional setState
- Host: GitHub
- URL: https://github.com/jxnblk/refunk
- Owner: jxnblk
- License: mit
- Archived: true
- Created: 2017-05-29T22:34:09.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2018-05-02T00:19:10.000Z (over 6 years ago)
- Last Synced: 2024-05-07T20:48:26.866Z (6 months ago)
- Topics: functional, react, setstate, state
- Language: JavaScript
- Homepage:
- Size: 286 KB
- Stars: 236
- Watchers: 10
- Forks: 17
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# Refunk 🎧
Simple React functional setState
with the new [React context API][context] (requires React v16.3 or later)```sh
npm i refunk
```## Getting Started
```jsx
import React from 'react'
import { connect } from 'refunk'// Create a state provider component
const App = connect(props => (
count: {props.count}
))// Updaters are functions that return state
const dec = state => ({ count: state.count - 1 })
const inc = state => ({ count: state.count + 1 })// Connect the Controls component to the App state
const Controls = connect(props => (
{props.count}
props.update(dec)}>
-
props.update(inc)}>
+
))const initialState = {
count: 0
}// initialize state with props
render()
```## Usage
Refunk components initialize state from props and provide an `update` function to their consumers.
When nesting Refunk components, the top-most component will control state for any child Refunk components.The `update` function works the same as `setState`, but it's intended to be used with separate [updater functions](#using-updaters),
that can be shared across many parts of an application.### connect
The `connect` higher-order component creates state based on props for top-level components or connects into a parent Refunk component's state when nested.
This allows for the creation of stateful components that can work standalone or listen to a parent's state.```jsx
import React from 'react'
import { connect } from 'refunk'const App = connect(props => (
{props.count}
))App.defaultProps = {
count: 0
}export default App
```### Provider
For lower-level access to React's context API, the Provider component can be used to create a context.
The Refunk Provider will convert props to initial state and provide the state and `update` function through context.```jsx
import React from 'react'
import { Provider } from 'refunk'const App = props => (
)
```### Consumer
The context Consumer is also exported for lower-level access to the context API.
```jsx
import React from 'react'
import { Provider, Consumer } from 'refunk'const inc = state => ({ count: state.count + 1 })
const App = props => (
{state => (
{state.count}
state.update(inc)}>+
)}
)
```### Using Updaters
Updaters are functions that are passed to the `props.update()` function.
An updater function takes `state` as its only argument and returns a new state.```jsx
// updaters.js
// Create an `updaters` module with functions to update the state of the app
export const decrement = state => ({ count: state.count - 1 })
export const increment = state => ({ count: state.count + 1 })
``````jsx
// Counter.js
// Use the updater functions in the connected Counter component
import React from 'react'
import { connect } from 'refunk'
import { decrement, increment } from './updaters'const Counter = props => (
Count: {props.count}
props.update(decrement)}>
Decrement
props.update(increment)}>
Increment
)export default connect(Counter)
``````jsx
// App.js
// Include the Counter component in App
import React from 'react'
import { connect } from 'refunk'
import Counter from './Counter'const App = props => (
Hello
)export default connect(App)
```## Build Your Own
Refunk's [source](src) is only about 50 LOC and relies on built-in React functionality.
This library is intended to be used directly as a package and also to serve as an example of some ways to handle state in a React application.
Feel free to fork or steal ideas from this project, and build your own version.## Concepts
Refunk is meant as a simpler, smaller alternative to other state
managment libraries that makes use of React's built-in component state.
Refunk uses higher-order components, the new [context API][context], and React component state management along with
[functional setState][setState]
to help promote the separation of presentational and container components,
and to keep state updating logic outside of the components themselves.This library also promotes keeping application state in a single location,
similar to other [Flux][flux] libraries and [Redux][redux].### Related
- [microstate](https://github.com/estrattonbailey/microstate)
- [statty](https://github.com/vesparny/statty)
- [unistore](https://github.com/developit/unistore)
- [redux][redux]
- [unstated](https://github.com/jamiebuilds/unstated)[context]: https://reactjs.org/docs/context.html
[setState]: https://facebook.github.io/react/docs/react-component.html#setstate
[flux]: http://facebook.github.io/flux/
[redux]: http://redux.js.org/---
[Made by Jxnblk](http://jxnblk.com) | [MIT License](LICENSE.md)