0.4.3-alpha • Published 6 years ago

picostore v0.4.3-alpha

Weekly downloads
-
License
ISC
Repository
-
Last release
6 years ago

PicoStore

PicoStore is a small and fast state management container for JavaScript apps.

Note: this library is currently in alpha and therefore the API is subject to breaking changes.

Features:

  • tiny (<1KB minified)
  • no dependencies
  • single atomic state object
  • modular: all functionality added in modules to aid separation of concerns and portability
  • computed properties
  • subscribe to changes in specific properties in the state object

Installation

$ npm install picostore --save

Minimal example

import createStore from 'picostore';

const config = {
  counter: {
    actions: {
      up: value => state => ({ count: state.count + value }),
      down: value => state => ({ count: state.count - value })
    },
    state: {
      count: 0
    }
  }
};

const store = createStore(config);

store.actions.counter.up(1);
console.log(store.state.count); // 1

Async

Actions don't have to return a segment of the state, they can be used to fire asynchronous actions, or do anything else you want. If you later want to update the state synchronously, you must call another action:

const config = {
  counter: {
    actions: {
      get: () => ({ actions }) => new Promise((resolve) => {
        actions.set(1);
        resolve();
      }),

      set: value => state => ({ count: value });
    },
    state: {
      count: 0;
    }
  }
}

const store = createStore(config);

store.actions.getCount();
console.log(1);

// outputs:
// 1
// 2

Computed Properties

Add computed properties by specifying dependencies up front. Computed functions are memoized so they are exceedingly fast.

const config = {
  counter: {
    actions: {
      up: value => state => ({ count: state.count + value }),
      down: value => state => ({ count: state.count - value }),
    },
    computed: {
      total: ['count', 'initial', (state) => state.count + state.initial],
    }
    state: {
      count: 0,
      initial: 5,
    }
  }
};

const store = createStore(config);
store.actions.counter.up(1)

console.log(store.state.counter.total); // 6

Subscriptions

Subscribe to nested properties by specifying their paths in dot notation. You can also subscribe to computed properties.

let count, total;

const config = {
  counter: {
    actions: {
      up: value => state => ({ count: state.count + value }),
    },
    computed: {
      total: ['count', 'initial', (state) => state.count + state.initial],
    }
    state: {
      count: 0,
      initial: 5,
    },
    subscriptions: {
      count: (newVal) => { count = newVal; }
      total: (newVal) => { total = newVal; } // subscribe to computed properties too
    }
  }
};

const store = createStore(config);

store.actions.counter.up(1);

console.log(count, total); // 1, 6
0.4.3-alpha

6 years ago

0.4.2-alpha

6 years ago

0.4.2

6 years ago

0.3.2

6 years ago

0.2.2

6 years ago

0.2.1

6 years ago

0.1.1

6 years ago

0.1.0

6 years ago