Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

rocketgaea/rematch

Repository files navigation

Rematch Logo

Build Status Coverage Status Codacy Badge npm version file size file size

Rematch

Rethink Redux.

Rematch is Redux best practices without the boilerplate. No more action types, action creators, switch statements or thunks.

Index

Getting Started

npm install @rematch/core

Step 1: Init

init configures your reducers, devtools & store.

index.js

import { init } from '@rematch/core'
import * as models from './models'
const store = init({
 models,
})

For a more advanced setup, see plugins and Redux config options.

Step 2: Models

The model brings together state, reducers, async actions & action creators in one place.

models.js

export const count = {
 state: 0, // initial state
 reducers: {
 // handle state changes with pure functions
 increment(state, payload) {
 return state + payload
 }
 },
 effects: {
 // handle state changes with impure functions.
 // use async/await for async actions
 async incrementAsync(payload, rootState) {
 await new Promise(resolve => setTimeout(resolve, 1000))
 this.increment(payload)
 }
 }
}

Understanding models is as simple as answering a few questions:

  1. What is my initial state? state
  2. How do I change the state? reducers
  3. How do I handle async actions? effects with async/await

Step 3: Dispatch

dispatch is how we trigger reducers & effects in your models. Dispatch standardizes your actions without the need for writing action types or action creators.

import { dispatch } from '@rematch/core'
 // state = { count: 0 }
// reducers
dispatch({ type: 'count/increment', payload: 1 }) // state = { count: 1 }
dispatch.count.increment(1) // state = { count: 2 }
// effects
dispatch({ type: 'count/incrementAsync', payload: 1 }) // state = { count: 3 } after delay
dispatch.count.incrementAsync(1) // state = { count: 4 } after delay

Dispatch can be called directly, or with the dispatch[model][action](payload) shorthand.

Examples

import React from 'react'
import ReactDOM from 'react-dom'
import { Provider, connect } from 'react-redux'
import { init } from '@rematch/core'
// State
const count = {
 state: 0, // initial state
 reducers: {
 // handle state changes with pure functions
 increment(state, payload) {
 return state + payload
 }
 },
 effects: {
 // handle state changes with impure functions.
 // use async/await for async actions
 async incrementAsync(payload, rootState) {
 await new Promise(resolve => setTimeout(resolve, 1000))
 this.increment(payload)
 }
 }
}
const store = init({
 models: {
 count
 }
})
// View
const Count = props => (
 <div>
 The count is {props.count}
 <button onClick={props.increment}>increment</button>
 <button onClick={props.incrementAsync}>incrementAsync</button>
 </div>
)
const mapState = state => ({
 count: state.count
})
const mapDispatch = dispatch => ({
 increment: () => dispatch.count.increment(1),
 incrementAsync: () => dispatch.count.incrementAsync(1)
})
const CountContainer = connect(mapState, mapDispatch)(Count)
ReactDOM.render(
 <Provider store={store}>
 <CountContainer />
 </Provider>,
 document.getElementById('root')
)

Migrating From Redux

Moving from Redux to Rematch involves very few steps.

  1. Setup Rematch init with Redux step 1
  2. Mix reducers & models step 2
  3. Shift to models step 3

API

See the @rematch/core API


Like this project? ★ us on Github :)

About

A Redux Framework

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 70.7%
  • TypeScript 27.5%
  • Other 1.8%

AltStyle によって変換されたページ (->オリジナル) /