vigour-state
Fast reactive state management for observables.
Inspired by virtual-dom tree-diffing algorithms and merkle-trees.
Inherits or extends vigour-observable
####simple
var State = require('vigour-state')
var state = new State()
state.subscribe({
field: { val: true }
}, (state, type) => {
console.log(type, state)
})
state.set({ field: 'hello' })
####any
var State = require('vigour-state')
var state = new State()
state.subscribe({
$any: { title: { val: true } }
}, (state, type) => {
console.log(type, state)
})
state.set({ a: { title: 'a title' } })
####switch
switch between different subscriptions based on conditions
var State = require('vigour-state')
var state = new State()
state.subscribe({
field: {
$switch: {
exec: (state) => state.key === 'bird' ? 'animal' : 'person',
animal: {
class: { val: true },
diet: { val: true }
},
person: {
name: { val: true },
job: { val: true }
}
}
}
}, (state, type) => {
console.log(type, state)
})
state.set({
bird: {
class: 'predator',
diet: 'mice'
},
someone: {
name: 'chris',
job: 'bird-watcher'
}
})
state.set({ field: state.bird })
state.bird.class.set('vegetarian')
state.bird.set({ job: 'accountant' })
state.set({ field: state.someone })
state.someone.set({ diet: 'paleo' })
####root
var State = require('vigour-state')
var state = new State()
state.subscribe({
field: {
another: {
$root: { something: { val: true } }
}
}
}, (state, type) => {
console.log(type, state)
})
state.set({ something: true })
state.set({ field: { another: true } })
####self
var State = require('vigour-state')
var state = new State({
a: {
field: 'bye'
},
field: {
val: '$root.a',
field: 'hello'
}
})
state.subscribe({
$self: {
field: {
field: {
val: true
}
}
}
}, (state, type) => {
console.log(type, state)
})
####parent
var State = require('vigour-state')
var state = new State()
state.subscribe({
field: {
another: {
$parent: { something: { val: true } }
}
}
}, (state, type) => {
console.log(type, state)
})
state.set({ field: { something: true } })
state.set({ field: { another: true } })
####test
var State = require('vigour-state')
var state = new State()
state.subscribe({
movies: {
$any: {
$test: {
exec (state) {
var query = state.getRoot().query.compute()
if (query && state.title) {
return (state.title.compute().indexOf(query) > -1)
}
},
$: {
title: {},
$root: { query: {} }
},
$pass: {
val: 1,
description: { val: true },
title: { val: true },
$root: {
current: { val: true }
}
}
}
}
}
}, (state, type) => {
console.log(type, state)
})
state.set({
query: 'interstellar',
movies: [
{
title: 'jump street',
description: 'its about streets!'
},
{
title: 'interstellar',
description: 'its about stars!'
}
]
})
state.query.set('jump')
Or any combination of the above
####inject
convert any observable to a state-observable
var Observable = require('vigour-observable')
var obs = new Observable({
inject: require('vigour-state/inject')
})
obs.subscribe({ field: { val: true }}, () => {})