LoginSignup
4
4

More than 5 years have passed since last update.

軽量版reduxまとめ

Last updated at Posted at 2017-10-27

storybookとか、大したアプリケーションを作らない時にreactのstate以上redux未満なものが欲しくなるときがあるので、軽量版reduxをまとめました。随時更新。

20171215更新:react-powerplug追加

react-powerplug

Renderless Pluggable State Containers
https://github.com/renatorib/react-powerplug

sample

import { State, Index, Toggle } from 'react-powerplug'
import { Pagination, Tabs, Checkbox } from './MyDumbComponents'

<State initial={{ offset: 0, limit: 10, totalCount: 200 }}>
  {({ state, setState }) => (
    <Pagination {...state} onChange={(offset) => setState({ offset })} />
  )}
</State>

<Index initial={0}>
  {({ index, setIndex }) => (
    <Tabs selected={index} onChange={setIndex}>
      <Tab title="First tab">Content from the first tab</Tab>
      <Tab title="Second tab">Content from the second tab</Tab>
    </Tabs>
  )}
</Index>

<Toggle initial={true}>
  {({ on, toggle }) => (
    <Checkbox checked={on} onChange={toggle} />
  )}
</Toggle>

// You can also use a `render` prop instead

<Toggle
  initial={false}
  render={({ on, toggle }) => (
    <Checkbox checked={on} onChange={toggle}>
  )}
/>

Refunk

Simple React functional setState
https://github.com/jxnblk/refunk

sample

import React from 'react'
import connect from 'refunk'

const App = connect(props => (
  <div>
    <h1>count: {props.count}</h1>
    <Controls />
  </div>
))

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

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
}

render(<App {...initialState} />)

Repatch

Repatch is just a simplified Redux, that let you create actions more briefly by dispatching reducers directly.
https://github.com/jaystack/repatch

sample

import Store from 'repatch';

const store = new Store([]);
const addTodo = text => todos => [...todos, { text, checked: false }];

const checkTodo = index => todos => todos.map(
  (todo, i) => (i === index ? { ...todo, checked: !todo.checked } : todo)
);

const editTodo = (index, text) => todos => todos.map(
  (todo, i) => (i === index ? { ...todo, text } : todo)
);

const removeTodo = index => todos => todos.filter((_, i) => i !== index);

redux-ui

Easy UI state management for react redux
https://github.com/tonyhb/redux-ui

sample

import ui from 'redux-ui';
import React, { Component } from 'react';

@ui({
  state: {
    filter: (props, state) => state.router.location.query.filter,
    isFormVisible: true,
    isBackgroundRed: false
  }
})
class A extends Component {
  render() {
    return (
      <div>
        <pre><code>{ this.props.ui }</code></pre>
        <B />
      </div>
    );
  }
}

redux-zero

A lightweight state container based on Redux
https://github.com/concretesolutions/redux-zero

sample

import React from "react";
import { connect } from "redux-zero/react";

import actions from "./actions";

const mapToProps = ({ count }) => ({ count });

export default connect(mapToProps, actions)(({ count, increment, decrement }) => (
  <div>
    <h1>{count}</h1>
    <div>
      <button onClick={decrement}>decrement</button>
      <button onClick={increment}>increment</button>
    </div>
  </div>
));
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4