Concepts

Feeble structures all your logic to a app and the only concept Feeble introduced is model, model let you model your domain's actions, reducer, effects, and selectors in one place.

Model

A model is a object contains state, actions, reducer, effects, selectors.

Here's a typical model example:

const count = feeble.model({
  namespace: 'count',
  state: 0,
})

count.action('increment')

count.reducer(on => {
  on(count.increment, state => state + 1)
})

Let's walk through above example line by line to see what dose it do.

First, we create a model using feeble.model, and giving it a namespace which is required for a model, and a initial state.

Then, we define a increment action creator by calling count.action, and we can use count.increment to reference this action creator later.

Last, we create reducer by calling count.reducer, counter.reducer accept a function which takes a on param, you can use on to register actions to reducer.

action creator and reducer are all Redux's concepts, so what is effects?

Feeble using redux-saga to handle side effects, so effect is a saga actually. Let's define a effect for above count model.

model.effect(function* {
  yield* takeEvery(count.increment, function* ({ payload }) {
    yield call(localStorage.setItem, 'count', payload)
  })
})

When you attach model to the app, Feeble will run your saga automaticly.