• This repository has been archived on 04/Jul/2019
  • Stars
    star
    239
  • Rank 163,404 (Top 4 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created almost 7 years ago
  • Updated about 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🎧 Simple React functional setState

Refunk 🎧

Simple React functional setState with the new React context API (requires React v16.3 or later)

npm i refunk

Getting Started

import React from 'react'
import { connect } from 'refunk'

// Create a state provider component
const App = connect(props => (
  <div>
    <h1>count: {props.count}</h1>
    <Controls />
  </div>
))

// 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 => (
  <div>
    <samp>{props.count}</samp>
    <button onClick={e => props.update(dec)}>
      -
    </button>
    <button onClick={e => props.update(inc)}>
      +
    </button>
  </div>
))

const initialState = {
  count: 0
}

// initialize state with props
render(<App {...initialState} />)

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

import React from 'react'
import { connect } from 'refunk'

const App = connect(props => (
  <div>
    <samp>{props.count}</samp>
  </div>
))

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.

import React from 'react'
import { Provider } from 'refunk'

const App = props => (
  <Provider count={0}>
    <div />
  </Provider>
)

Consumer

The context Consumer is also exported for lower-level access to the context API.

import React from 'react'
import { Provider, Consumer } from 'refunk'

const inc = state => ({ count: state.count + 1 })

const App = props => (
  <Provider count={0}>
    <Consumer>
      {state => (
        <React.Fragment>
          <samp>{state.count}</samp>
          <button onClick={e => state.update(inc)}>+</button>
        </React.Fragment>
      )}
    </Consumer>
  </Provider>
)

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.

// 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 })
// 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 => (
  <div>
    <samp>Count: {props.count}</samp>
    <button onClick={e => props.update(decrement)}>
      Decrement
    </button>
    <button onClick={e => props.update(increment)}>
      Increment
    </button>
  </div>
)

export default connect(Counter)
// App.js
// Include the Counter component in App
import React from 'react'
import { connect } from 'refunk'
import Counter from './Counter'

const App = props => (
  <div>
    <h1>Hello</h1>
    <Counter />
  </div>
)

export default connect(App)

Build Your Own

Refunk's source 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, and React component state management along with functional 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 libraries and Redux.

Related


Made by Jxnblk | MIT License

More Repositories

1

mdx-deck

♠️ React MDX-based presentation decks
JavaScript
11,260
star
2

loading

This could take a while
CSS
3,531
star
3

colorable

Color combination contrast tester
HTML
1,958
star
4

reflexbox

Moved to https://rebassjs.org
JavaScript
1,360
star
5

fitter-happier-text

Performant, fully fluid headings
HTML
1,291
star
6

repng

React component to PNG converter
JavaScript
893
star
7

geomicons-open

Open Source Icons for the Web
HTML
832
star
8

palx

🌈 Automatic UI Color Palette Generator
JavaScript
831
star
9

ok-mdx

Browser-based MDX editor
JavaScript
758
star
10

ram

βš›οΈ React Application Manager: create and run React (and other) applications – no command line or build setup required
JavaScript
585
star
11

react-x-ray

React CSS Layout Debugger
JavaScript
573
star
12

macro-components

Create flexible layout and composite UI components without the need to define arbitrary custom props
JavaScript
485
star
13

plangular

Create custom SoundCloud players with HTML & CSS
HTML
485
star
14

shade

Gradient explorer
HTML
460
star
15

mdx-docs

πŸ“ Document and develop React components with MDX and Next.js
JavaScript
452
star
16

paths

Build and edit SVGs in the browser
JavaScript
418
star
17

tachyons-components

React UI components powered by Tachyons with a styled-components like API
JavaScript
413
star
18

mdx-go

⚑ Lightning fast MDX-based dev server for progressive documentation
JavaScript
363
star
19

microicon

SVG icon microservice
JavaScript
360
star
20

static-react

Zero-configuration CLI React static renderer
JavaScript
350
star
21

reline

React SVG line icon components
JavaScript
248
star
22

react-css-grid

React layout component based on CSS Grid Layout and built with styled-components
JavaScript
245
star
23

hello-color

JavaScript
233
star
24

gravitons

JavaScript
218
star
25

layouts

Grab-and-go layouts for React
JavaScript
215
star
26

axs

Stupid simple style components for React
JavaScript
209
star
27

contrast-swatch

πŸ…°οΈ Image microservice for color contrast information
JavaScript
209
star
28

rgx

React grid system based on minimum and maximum widths
JavaScript
202
star
29

nano-component

Fast & simple React component styles in under 1kb
JavaScript
196
star
30

mdx-blocks

JavaScript
191
star
31

vhs

Post-Future CSS Animations
HTML
184
star
32

papercraft

Hand-coded SVG lettering
CSS
153
star
33

blog

Personal blog on design & development
HTML
146
star
34

figma-theme

Generate development-ready theme JSON files from Figma Styles
JavaScript
135
star
35

react-icons

Building SVG Icons with React
HTML
134
star
36

system-components

https://github.com/jxnblk/styled-system/tree/master/system-components
JavaScript
131
star
37

rmdi

React Material Design Icons – built with Pixo, Styled Components, and Styled System
JavaScript
129
star
38

Heather

A HyperMinimal Jekyll Theme
CSS
129
star
39

geomicons-wired

Geometric Icons
CSS
125
star
40

react-static-site-boilerplate

Demo boilerplate for generating a static site with React
HTML
115
star
41

rebranch

React context-based, conditional rendering components for A/B experiments
JavaScript
107
star
42

Ashley

A Readable & Responsive Theme for Tumblr
CSS
106
star
43

ejsx

Pure JSX templates for rendering static HTML
JavaScript
105
star
44

superbox

DEPRECATED: See https://rebassjs.org/reflexbox instead
JavaScript
102
star
45

live-doc

πŸ’« Convert markdown to live React demos
JavaScript
99
star
46

gatsby-themes

JavaScript
98
star
47

Twipster

CSS
95
star
48

css-to-object

JavaScript
92
star
49

dropbar

JavaScript
89
star
50

react-geomicons

React icon component for Geomicons Open
JavaScript
88
star
51

nano-style

React functional CSS-in-JS
JavaScript
85
star
52

rebass-recomposed

JavaScript
78
star
53

SoundRad

A Radically Simpler & Faster SoundCloud Player
JavaScript
77
star
54

horror

😱 React HTML elements with CSS-in-JS
JavaScript
77
star
55

Spectral

Click the Rainbow
JavaScript
74
star
56

vim-mdx-js

Vim Script
74
star
57

skullcat

a avatar fur mrmrs
JavaScript
73
star
58

_gx

DEPRECATED Minimal responsive React grid system based on the Fab Four Technique.
HTML
73
star
59

stepkit

JavaScript
72
star
60

bumpkit

JavaScript
70
star
61

rrx

βš›οΈ Minimal React router using higher order components
JavaScript
69
star
62

f0

JavaScript
66
star
63

type-system

HTML
66
star
64

understyle

Functional style utilities for authoring JavaScript style objects
JavaScript
60
star
65

gatsby-theme-mdx-blog

JavaScript
58
star
66

microbeats

Beats Created in Under an Hour
JavaScript
56
star
67

hypercolors

Generative hyperterm color theme
JavaScript
55
star
68

react-cxs

ϟ Alternative React.createElement function which allows style objects to be passed to the className prop to generate CSS
JavaScript
55
star
69

reaxe

🍬 Syntactic sugar for React.createElement and JSX alternative
JavaScript
51
star
70

formula

CSS calculator for bulletproof form and button styles that always line up
JavaScript
50
star
71

diet-cola

A lightweight styled-components clone for creating React UI component primitives.
JavaScript
49
star
72

tempo

Responsive Grid System
CSS
48
star
73

hyperterminator

Hyperterm theme for cybernetic organisms
JavaScript
47
star
74

react-fitter-happier-text

React component for fully fluid headings
JavaScript
46
star
75

css-scss

Convert CSS syntax to SCSS with calc, variables, and custom media queries
JavaScript
44
star
76

react-owl

πŸ¦‰ React layout component based on the lobotomized owl selector and built with styled-components
JavaScript
43
star
77

robox

Higher-order React component for adding style helper props based on understyle
JavaScript
41
star
78

monochrome

JavaScript
40
star
79

hyp

ϟ Functional UI component microlibrary with ES6 tagged template literals
JavaScript
39
star
80

superstyle

CSSOM-JS utility library
JavaScript
39
star
81

universal-components

JavaScript
38
star
82

scrs

JavaScript
38
star
83

hidden-styled

JavaScript
37
star
84

grays

HTML
35
star
85

colorable-app

Color constrast checker
JavaScript
34
star
86

principles

My principles of web design
HTML
33
star
87

object-style

JavaScript
33
star
88

redeck

DEPRECATED: see https://github.com/jxnblk/mdx-deck
JavaScript
32
star
89

react-component-permutations

Uses propTypes to create an array of React component props to display various permutations.
HTML
32
star
90

tag-hoc

React HOC to set an element's tag and remove props
JavaScript
31
star
91

cxs-components

Styled UI component primitives for React - built with cxs
JavaScript
31
star
92

kenburns

Sass mixin for Ken Burns effect background images
CSS
30
star
93

json-react

JavaScript
30
star
94

react-media-context

React higher-order component (HOC) to provide context for the currently matched media query.
JavaScript
30
star
95

watch

In case you forget what time it is
JavaScript
30
star
96

react-simple-icons

JavaScript
29
star
97

path-ast

SVG path element command parser/stringifier
JavaScript
29
star
98

typography-system

JavaScript
29
star
99

simple-modular-scale

Modular scale generator based on an array of ratios
JavaScript
29
star
100

mdx-themes

JavaScript
26
star