react-swag

0.0.23 • Public • Published

SWAG Logo

SWAG is a straightforward React state manager wich sounds familiar for those who likes View-Model pattern.

build status code coverage npm version npm downloads Maintainability Size MIT

Install

npm install --save react-swag
yarn add react-swag

Basic Setup

You will need two things, connect and createStore
connect(ReactComponent, Store)
createStore(Object or Class)

You get than like this :

import { createStore, connect } from 'react-swag';

Now you would like to create your store, with your data and methods as object properties.

const store = {
    counter: 1,
    add(){
        this.counter++;
    }
}
// you could also do this :
class Store = {
    constructor(){
        this.counter = 1
    }
    add(){
        this.counter++
    }
}

Now you create your presentation layer as a React Component directly accessing your store

const Component = () => (
    <div onClick={Store.add}>{Store.counter}</div>
)

now connect your component to the store if you want it to update on store changes

const ConnectedComponent = connect(Component, store);

BOOM ! its working.

Demo

LIVE DEMO

Things you need to know about SWAG

💎You can easily deal with async operations using ing helper

const wait = time => new Promise(r => setTimeout(r, time));

const Store = createStore({
  ammount: 8,
  async lazyAdd() {
    await wait(1000).then(() => this.ammount++);
  }
});

const Component = connect(
  ({ ing }) => ing(Store.lazyAdd) ? "loading" : <div onClick={Store.lazyAdd}>{Store.ammount}</div>,
  Store
);

Demo

LIVE DEMO

What if you would like to have separated loading behaviors within the same method ?

const wait = time => new Promise(r => setTimeout(r, time));

const Store = createStore({
  ammount: 8,
  async lazyAdd(ammountToAdd) {
    await wait(1000).then(() => (this.ammount += ammountToAdd));
  }
});

const Component = connect(
  ({ ing }) => {
    return (
        <div>
            {Store.ammount}
            <br />
                {ing(Store.lazyAdd, [5]) ? 

                     "Loading ..." 
                    :
                    <input type="button" onClick={() => Store.lazyAdd(5)} value="add 5" />
                }

                {ing(Store.lazyAdd, [10]) ? 

                     "Loading ..." 
                    :
                    <input type="button" onClick={() => Store.lazyAdd(10)} value="add 10" />
                }
        </div>
    );
  }, Store );

Demo

LIVE DEMO

💎Your changes to store properties will always sync to the UI.

const Store = createStore({
  ammount: 8,
  add() {
    this.ammount++;
  }
});

setInterval(() => {
  Store.add();
}, 100);

const Component = connect(
  () => <div onClick={Store.add}>{Store.ammount}</div>,
  Store
);

Demo

LIVE DEMO

you can also direct set

Like this :

setInterval(() => {
  Store.add();
}, 100);

or this (for debugging purpose) :

window.store = Store

Demo

💎I am still thinking the whole nomenclature

💎I`d love to hear yout opinion

License

MIT

Readme

Keywords

none

Package Sidebar

Install

npm i react-swag

Weekly Downloads

2

Version

0.0.23

License

Apache-2.0

Unpacked Size

3.17 MB

Total Files

16

Last publish

Collaborators

  • guisouza