Skip to main content

Store

Store is an object that holds the state value. Store is updated when it receives a value that is not equal (!==) to current one and to undefined

Store Methods#

map(fn: (state: State, lastState?: T) => T)#

Creates a derived store. It will call a provided function with the state, when the original store updates, and will use the result to update the derived store

Formulae#

const $second = $first.map(fn)
  • When $first store is updated, call fn with new state and previous state
  • Next update $second store with result of fn() call and trigger all subscribers

Arguments

  1. fn (Function): Function that receives state and lastState? and returns a new state for the derived store

If the function returns an old state or if it returns undefined, the new store will not be updated.

Should be pure

Returns

Store: New store

Example#

import {createEvent, createStore} from 'effector'
const changed = createEvent()
const title = createStore('').on(changed, (_, newTitle) => newTitle)
const length = title.map(title => title.length)
length.watch(length => {
console.log('new length', length)
})
// => new length 0
changed('hello')
// => new length 5
changed('world')
// no reaction
changed('hello world')
// => new length 11

Try it


on(trigger, reducer)#

Updates state when trigger is triggered by using reducer. For each trigger, last installed reducer will override previous reducers (useful for dynamic behavior).

Formulae#

$store.on(trigger, reducer)
  • When trigger is triggered, call reducer with payload of the trigger and data of $store
  • Next update $store with result of reducer call and trigger all subscribers

Arguments

  1. trigger Event, Effect or another Store
  2. reducer Reducer: Function that receives state and params and returns a new state, should be pure. A store cannot hold an undefined value. If a reducer function returns undefined, the store will not be updated.
    • state: Current state of store
    • params: Parameters passed to event call

Returns

Store: Current store

Example#

import {createEvent, createStore} from 'effector'
const store = createStore(0)
const changed = createEvent()
store.on(changed, (state, params) => state + params)
store.watch(value => {
console.log('updated', value)
})
// => updated 0
changed(2)
// => updated 2
changed(2)
// => updated 4

Try it


on(triggers[], reducer)#

since

effector 20.15.0

Updates state when any from triggers is triggered by using reducer.

Formulae#

$store.on([triggerA, triggerB, ...], reducer)
  • When triggerA or triggerB is triggered, call reducer with payload of the triggerA or triggerB and data of $store
  • Next update $store with result of reducer call and trigger all subscribers
  • Any count of triggers can be passed to triggers

Arguments

  1. triggers array of Event, Effect or Store
  2. reducer Reducer: Function that receives state and params and returns a new state, should be pure. A store cannot hold an undefined value. If a reducer function returns undefined, the store will not be updated.
    • state: Current state of store
    • payload: Value passed to event/effect call, or source if it passed as trigger

Returns

Store: Current store

Example#

import {createEvent, createStore} from 'effector'
const store = createStore(0)
const changedA = createEvent()
const changedB = createEvent()
store.on([changedA, changedB], (state, params) => state + params)
store.watch(value => {
console.log('updated', value)
})
changedA(2)
// => updated 2
changedB(2)
// => updated 4
// You can unsubscribe from any trigger
store.off(changedA)

Try it


watch(watcher)#

Call watcher function each time when store is updated.

Formulae#

const unwatch = $store.watch(watcher)
  • On initialize and each $store update, call watcher with the new state of $store
  • When unwatch is called, stop calling watcher

Arguments

  1. watcher (Watcher): Watcher function that receives current store state as the first argument

Returns

Subscription: Unsubscribe function

Example#

const add = createEvent()
const store = createStore(0).on(add, (state, payload) => state + payload)
store.watch(value => console.log(`current value: ${value}`))
// => current value: 0
add(4)
// => current value: 4
add(3)
// => current value: 7

watch(trigger, watcher)#

Run watcher only when trigger event triggered.

Formulae#

const unwatch = $store.watch(trigger, watcher)
  • On each $store update with passed trigger, call watcher with the new state of $store and payload from trigger
  • When unwatch is called, stop calling watcher

Arguments

  1. trigger Event, Effect or Store: Trigger, which leads to call of watcher
  2. watcher (Function): Function that receives current store state as the first argument and payload of trigger as the second argument.

Returns

Subscription: Unsubscribe function

Example 1#

.watch trigger watcher when foo is executed, because foo is explicitly passed to watch.
First argument of watcher is a state value, second is an event value.

import {createEvent, createStore} from 'effector'
const foo = createEvent()
const bar = createEvent()
const store = createStore(0)
store.watch(foo, (storeValue, eventValue) => {
console.log(`triggered ${storeValue}, ${eventValue}`)
})
foo(1)
// => triggered 0, 1
bar(2)
foo(3)
// => triggered 0, 3

Try it


reset(...triggers)#

Resets store state to the default value.

A state is reset when Event or Effect is called or another Store is changed.

Formulae#

$store.reset(...triggers)
  • When any unit from triggers list is triggered, update $store with its default state, from createStore(defaultState)

Arguments

  1. triggers ((Event | Effect | Store)[]): any number of Events, Effects or Stores

Returns

Store: Current store

Example#

import {createEvent, createStore} from 'effector'
const store = createStore(0)
const increment = createEvent()
const reset = createEvent()
store.on(increment, state => state + 1).reset(reset)
store.watch(state => console.log('changed', state))
// changed 0
// watch method calls its function immediately
increment() // changed 1
increment() // changed 2
reset() // changed 0

Try it


reset(triggersArray)#

since

effector 20.15.0

Resets store state to the default value. An overload for arrays of units, which make reset consistent with merge and store.on(triggers[], fn)

A state is reset when Event or Effect is called or another Store is changed.

Formulae#

$store.reset([triggerA, triggerB, ...])
  • When any unit from triggersArray list is triggered, update $store with its default state, from createStore(defaultState)

Arguments

  1. triggersArray ((Event | Effect | Store)[]): any number of Events, Effects or Stores

Returns

Store: Current store

Example#

import {createEvent, createStore} from 'effector'
const store = createStore(0)
const increment = createEvent()
const reset = createEvent()
store.on(increment, state => state + 1).reset([reset])
store.watch(state => console.log('changed', state))
// changed 0
// watch method calls its function immediately
increment() // changed 1
increment() // changed 2
reset() // changed 0

Try it


off(trigger)#

$store.off(trigger)
  • Removes reducer for given trigger, which was installed via \$store.on or \$store.reset
  • If there was no reducer for that trigger, this method will do nothing

Arguments

  1. trigger: Event, Effect or Store

Returns

Store: Current store

Example#

import {createEvent, createStore} from 'effector'
const store = createStore(0)
const changedA = createEvent()
const changedB = createEvent()
// If you want to unsubscribe from all triggers simultaneously, better to manually merge
const changed = merge([changedA, changedB])
store.on(changed, (state, params) => state + params)
store.off(changed)

Try it


thru(fn)#

Call function with the given store and return result as it is.

Formulae#

const result = $store.thru(fn)
  • Call fn with $store as argument
  • Return result of the fn() call

Arguments

  1. fn (Function): Function that receives Store and returns some value, should be pure

Returns

(any): Value, returned by fn

Example#

import {createStore, createEvent} from 'effector'
const enhance = fn => store => store.map(fn)
const inc = createEvent()
const $num = createStore(1)
$num.on(inc, n => n + 1)
//prettier-ignore
const $result = $num
.thru(enhance(x => x + 1))
.thru(enhance(x => x * 10))
$num.watch(n => {
console.log('num', n)
})
// => num 1
$result.watch(n => {
console.log('result', n)
})
// => result 20
inc()
// => num 2
// => result 30

Try it


Store Properties#

updates#

Formulae#

$store.updates
  • When $store is changed trigger updates event with the new state

Returns

Event: Event that represents updates of the given store.

Use case: watchers, which will not trigger immediately after creation (unlike store.watch)

import {createStore, is} from 'effector'
const clicksAmount = createStore(0)
is.event(clicksAmount.updates) // => true
clicksAmount.watch(amount => {
console.log('will be triggered with current state, immediately, sync', amount)
})
clicksAmount.updates.watch(amount => {
console.log('will not be triggered unless store value is changed', amount)
})

Try it


shortName#

Returns

(string): ID or short name of the store


defaultState#

Returns

(State): Default state of the store

Example#

const $store = createStore('DEFAULT')
console.log($store.defaultState === 'DEFAULT')
// => true

Utility methods#

getState()#

Returns current state of store

You don't need this method!

getState() gives rise to difficult to debug imperative code and kind of race condition. Prefer declarative sample to pass data from store and attach for effects

Returns

(State): Current state of the store

Example#

import {createEvent, createStore} from 'effector'
const add = createEvent()
const $number = createStore(0)
$number.on(add, (state, data) => state + data)
$number.watch(n => {
console.log(n)
})
// => 0
add(2)
// => 2
add(3)
// => 5

Try it

Last updated on