JSPM

  • Created
  • Published
  • Downloads 10
  • Score
    100M100P100Q70591F
  • License MIT

CANT inc. state management system.

Package Exports

  • watch-state

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (watch-state) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

      watch-state

watch-state

NPM minzipped size downloads license tests
CANT inc. state management system.

Fast
Fast
Light
Light
Smart
Smart
  One of the fastest   Less than 1kb minzip Steady architecture

stars watchers

Browser supports

Desktop

Firefox Chrome Safari Opera Edge
45+ 49+ 9+ 36+ 13+

Mobile

Firefox Chrome Safari Opera
87+ 90+ 9+ 62+

You can transpile it supporting old browsers, but the performance decreases.

Installation

npm

npm i watch-state

yarn

yarn add watch-state

Or you can include this script to the head.

<script defer src="https://unpkg.com/watch-state/watch-state.min.js"></script>

Use watchState to get any class from the library.

const {
  Watch,
  State,
  Cache,
  Event
} = watchState

Using

Simple example:

You can create an instance of State and watch it's value.

import {Watch, State} from 'watch-state'

const count = new State(0)

new Watch(() => console.log(count.value))
// console.log(0)

count.value++
// console.log(1)

count.value++
// console.log(2)
Update argument:

You can check if the watching ran first by update argument.

const count = new State(0)

new Watch(update => {
  console.log(update, count.value)
})
// console.log(false, 0)

count.value++
// console.log(true, 1)

count.value++
// console.log(true, 2)
Force update of State

You can run watchers of a state with update method.

const count = new State(0)

new Watch(() => {
  console.log(count.value)
})
// console.log(0)

count.update()
// console.log(0)
Force update of Watch

You can run a watcher even when it's states are not updated.

const count = new State(0)

const watcher = new Watch(() => {
  console.log(count.value)
})
// console.log(0)

watcher.update()
// console.log(0)
Destroy

You can stop watching by destroy method of Watch.

const count = new State(0)

const watcher = new Watch(() => {
  console.log(count.value)
})
// console.log(0)

count.value++
// console.log(1)

watcher.destroy()

count.value++
// nothing happens
Watch.onDestroy()

You can react on destruction of Watch by onDestroy method.

const watcher = new Watch(() => {})

watcher.onDestroy(() => {
  console.log('destructor')
})

watcher.destroy()
// console.log('destructor')

onDestructor returns this so you can use fluent interface.

const watcher = new Watch(() => {})
  .onDestroy(() => console.log('destructor'))

watcher.destroy()
// console.log('destructor')
Deep watch:

You can use Watch inside a watcher. Each watcher reacts on that states which used only inside it.

const watching = new State(true)
const state = new State(0)
let test = 0

new Watch(() => {
  test++
  if (watching.value) {
    new Watch(() => {
      console.log(state.value)
    })
  }
})
// console.log(0), test = 1

state.value++
// console.log(1), test = 1

watching.value = false
// test = 2

state.value++
// nothing happens
Cache:

You can cache computed values.
The watcher will not be triggered while new result is the same.

const name = new State('Foo')
const surname = new State('Bar')

const fullName = new Cache(() => (
  `${name.value} ${surname.value[0]}`
))

new Watch(() => {
  console.log(fullName.value)
})
// console.log('Foo B')

surname.value = 'Baz'
// nothing happens

surname.value = 'Quux'
// console.log('Foo Q')

You can force update the cache by update method.

surname.update()
// console.log('Mike M')

You can use destroy and onDestroy like you do it on a watcher.

surname.destroy()

The computing will be triggered only when a state inside the cache will be changed. So you can modify data only when it's needed.

const list = new State(['foo', 'bar', 'baz'])

const sortedList = new Cache(() => {
  console.log('computing')
  return [...list.value].sort()
})
// nothing happens

const value = sortedList.value
// console.log('computing')

console.log(sortedList.value)
// console.log(['bar', 'baz', 'foo'])

console.log(value === sortedList.value)
// console.log(true)

list.value = ['b', 'c', 'a']
// nothing happens

console.log(sortedList.value)
// console.log('computing')
// console.log(['a', 'b', 'c'])
Event:

Use Event when you change several states to run their watchers after the event finished.

const name = new State('Foo')
const surname = new State('Bar')
const event = new Event()

new Watch(() => {
  console.log(name.value, surname.value)
})
// console.log('Foo', 'Bar')

event.start()
name.value = 'Baz'
surname.value = 'Boo'
event.end()
// console.log('Baz', 'Boo')
Typescript:

Generic of State

const key = new State<string | number>()

key.value = false
// error, you can use only streng or number

Generic of Cache

new Cache<string>(() => false)
// error, target of cache should return string

Performance

You can check the performance test with MobX, effector and Redux. Clone the repo, install packages and run this command

npm run speed

I got this results:
test

You can find more tools here

Issues

If you find a bug or have a suggestion, please file an issue on GitHub
issues