A lightweight state container based on Redux
Read the intro blog post
- Single store
- No reducers
- Less boilerplate
- No PropTypes
- Smaller and simpler than redux
- Written in TypeScript
Installation
To install the stable version:
npm install --save redux-zero
This assumes that you’re using npm with a module bundler like Webpack
How
ES2015+ or TypeScript:
import createStore from "redux-zero"
import { Provider, connect } from "redux-zero/react"
CommonJS:
const createStore = require("redux-zero")
const { Provider, connect } = require("redux-zero/react")
UMD:
<script src="https://unpkg.com/redux-zero/dist/redux-zero.min.js"></script>
<script src="https://unpkg.com/redux-zero/react/index.min.js"></script>
Let's make an increment/decrement simple application with React:
First, create your store. This is where your application state will live:
import createStore from "redux-zero";
const initialState = { count: 1 };
const store = createStore(initialState);
export default store;
Then, create your actions. This is where you change the state from your store:
import store from "./store";
export const increment = () => {
store.setState({
count: store.getState().count + 1
})
}
export const decrement = () => {
store.setState({
count: store.getState().count - 1
})
}
Now create your component. With Redux Zero your component can focus 100% on the UI and just call the actions that will automatically update the state:
import React from "react";
import { connect } from "redux-zero/react";
import { increment, decrement } from "./actions";
const mapToProps = ({ count }) => ({ count });
export default connect(mapToProps)(({ count }) => (
<div>
<h1>{count}</h1>
<div>
<button onClick={increment}>increment</button>
<button onClick={decrement}>decrement</button>
</div>
</div>
));
Last but not least, plug the whole thing in your index file:
import React from "react";
import { render } from "react-dom";
import { Provider } from "redux-zero/react";
import store from "./store";
import Counter from "./Counter";
const App = () => (
<Provider store={store}>
<Counter />
</Provider>
);
render(<App />, document.getElementById("root"));
Here's the full version: https://codesandbox.io/s/n5orzr5mxj
Inspiration
Redux Zero was based on this gist by @developit
Roadmap
- Add more use case examples (including unit tests)
- Add (Provider, connect) to Preact
Docs