8000 GitHub - herber/nation: πŸŒπŸ’» A minimalist, functional state management library.
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

herber/nation

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

31 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Nation

πŸŒπŸ’» A minimalist, functional state management library.

Build Status

Features

  • Functional: Nation enforces functional programming.
  • Minimal: Nation is a fully functional state management lib weighing less than 500 byte.
  • Easy: Nation's API is as minimal as possible.
  • Immutable: State can only be set in actions or using setState.
  • Reactive: The update event is emitted on every state change.

Philosophy

State management libraries often weigh multiple kilobytes, even though most of the time you just need a small part of their API. Nation's approach is different - nation only includes the bare minimum state management functionality.

Nation enforces functional programming, this allows nation to be even tinier and makes you code more explicit.

Install

$ npm install nation

Usage

const nation = require('nation');

const ship = nation({
  initial: () => ({
    swimming: true
  })
});

console.log(ship.state().swimming);
// => true

Actions

ship.action(state => ({
  setSwimming: (val) => {
    state().swimming = val;
  },
  setName: (val) => {
    state().name = val;
  }
}));

ship.actions().setName('merry');
ship.actions().setSwimming(false);

console.log(ship.state().name);
// => 'merry'

console.log(ship.state().swimming);
// => false

State can also be set using setState

ship.setState({
  name: 'enterprise',
  swimming: true
})

console.log(ship.state().name);
// => 'enterprise'

console.log(ship.state().swimming);
// => true

Computed properties

Computed properties can be accessed like normal state values. They are computed every time the state changes.

ship.computed(state => ({
  swimmingName: () => {
    return `The ${state().swimming} is ${state().name == true ? 'swimming' : 'not swimming'}.`;
  }
}));

console.log(ship.state().swimmingName);
// => 'The enterprise is swimming.'

Lifecycle

Nations lifecycle consists of a single method: onChange.

ship.onChange((state) => {
  console.log('The state has changed - State: ', state);
});

Async actions

Nation treats every function the same no matter if it's sync or async. The only difference is, that in async functions you have to use setState to set state.

ship.action(state => ({
  setAsync: async () => {
    ship.setState({ asyncValue: await asyncFn() })
  }
}));

ship.actions().setAsync();

// Wait

console.log(ship.state().asyncValue);

Nested state

Nation state can be nested, the onChange event will be passed on, so even nested state is reactive.

Nested state cannot be set using actions, you have to use setState.

const cargo = nation({
  initial: () => {
    loaded: true
  }
});

ship.setState({
  cargo
});

ship.onChange((state) => {
  console.log('Loaded state: '+ state.loaded);
})

cargo.setState({
  loaded: false
});
// => Loaded state: false

License

MIT Β© Tobias Herber

About

πŸŒπŸ’» A minimalist, functional state management library.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
0